【问题标题】:How to query Vertical Column of Hive table in Horizontal output如何在水平输出中查询 Hive 表的垂直列
【发布时间】:2020-11-07 10:50:47
【问题描述】:

我有一个表垂直包含数据(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 |
+------------------------+--------+--------+----------+----------+---------+------+

【问题讨论】:

    标签: sql hive hql vertical-alignment


    【解决方案1】:

    您可以使用条件聚合:

    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, object, instance;
    

    如果要过滤特定对象或实例,请在 group by 之前添加 where 子句。

    请注意,这具有您需要明确指定的固定数量的列。如果您有可变数量的列并且不知道结果是什么样的,那么您需要使用动态 SQL。

    在 Hive 中,这通常意味着使用应用程序语言(例如 python 或 java 或其他语言)通过从数据中读取列来构造字符串中的查询)。

    【讨论】:

    • 嗨@Gordon,这个答案很好,但是我们有很多相同对象名称的列名,而且我们总是不知道所有列名。我们可以使用列引用关系或实例动态获取所有列名吗?
    • @AnamikaSingh 。 . .正如我在答案中提到的,您需要使用动态 SQL 在应用程序中构造查询。
    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2020-12-26
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多