如何在水平输出中查询Hive表的垂直列

问题描述

我有一个表,其中包含垂直的数据(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或其他),通过从数据中读取列来构造字符串中的查询。