问题描述
我有一个表,其中包含垂直的数据(attr_name和attr_value列),如下所示,但我想垂直打印数据。 Hive是否有可能?
+------------------------+--------+--------+---------------+------------+
|relation |object |instance|attr_name |attr_value |
+------------------------+--------+--------+---------------+------------+
|Summary~>disk~>disk-1 |disk |disk-1 |Size_MB |7726 |
|Summary~>disk~>disk-1 |disk |disk-1 |Write_MB |694 |
|Summary~>disk~>disk-1 |disk |disk-1 |Time_Pct |4 |
|Summary~>disk~>disk-1 |disk |disk-1 |disk |disK0 |
|Summary~>disk~>disk-2 |disk |disk-2 |Size_MB |476937 |
|Summary~>disk~>disk-2 |disk |disk-2 |Write_MB |0 |
|Summary~>disk~>disk-2 |disk |disk-2 |Time_Pct |4 |
|Summary~>disk~>disk-2 |disk |disk-2 |disk |disK1 |
+------------------------+--------+--------+---------------+------------+
我可以进行常规查询以获取attr_name的attr_value。但是我想获取所有与同一实例相关的输出行。
就像我想按实例获取所有attr_name和attr_value组一样,其中attr_value ='disK1',而查询引用将是attr_value如果我像选择关系一样查询,所有attr_name作为列,所有attr_value作为表名中的值,其中attr_value IN(disK1)用于相关实例。对于此查询 下面应该输出。我不想按实例进行分组,因为查询需要基于attr_value。
我可以得到这个值吗?
+------------------------+--------+--------+----------+----------+---------+------+
|relation |object |instance|Size_MB |Write_MB |Time_Pct |disK |
+------------------------+--------+--------+----------+----------+---------+------+
|Summary~>disk~>disk-2 |disk |disk-2 |476937 |0 |4 |disK1 |
+------------------------+--------+--------+----------+----------+---------+------+
解决方法
您可以使用条件聚合:
select relation,object,instance,max(case when attr_name = 'Size_MB' then attr_value end) as Size_MB,max(case when attr_name = 'Write_MB' then attr_value end) as Write_MB,max(case when attr_name = 'Time_Pct' then attr_value end) as Time_Pct,max(case when attr_name = 'Disk' then attr_value end) as Disk
from t
group by relation,instance;
如果要过滤特定对象或实例,请在where
之前添加group by
子句。
请注意,这具有固定数量的列,您需要明确指定这些列。如果您具有可变的列数并且不知道结果是什么样,那么您将需要使用动态SQL。
在Hive中,这通常意味着使用一种应用程序语言(例如python或java或其他),通过从数据中读取列来构造字符串中的查询。