【问题标题】:GROUPING() in hive?分组()在蜂巢中?
【发布时间】:2015-06-17 03:27:12
【问题描述】:

我已经给出了查询,与 teradata 兼容。它使用 Sqoop 在 dimension_tab 中导入了表。尝试在 HIVE 上执行,但不幸的是与 hive 兼容。

SELECT fact_1_id,
       fact_2_id,
       SUM(sales_value) AS sales_value,
       GROUPING(fact_1_id) AS f1g, 
       GROUPING(fact_2_id) AS f2g
FROM   dimension_tab
GROUP BY CUBE (fact_1_id, fact_2_id)
ORDER BY fact_1_id, fact_2_id;

然后我尝试使其与 HIVE 兼容。参考:维基

幸运的是,CUBE 在 HIVE 中可用,但语法不同

fact_1_id,fact_2_id WITH CUBE。但是表单文档, GROUPING() 在 HIVE 中不可用。

如果 GROUPING() 函数在 HIVE 中可用,请帮助我。 要么 如何在 HIVE 上运行查询?

【问题讨论】:

    标签: sql hadoop hive aggregate-functions teradata


    【解决方案1】:

    如果id 没有NULL 值,只需使用简单的逻辑:

    SELECT fact_1_id,
           fact_2_id,
           SUM(sales_value) AS sales_value,
           (case when fact_1_id is null then 1 else 0 end) as f1g,
           (case when fact_2_id is null then 1 else 0 end) as f2
    FROM   dimension_tab
    GROUP BY fact_1_id, fact_2_id WITH CUBE
    ORDER BY fact_1_id, fact_2_id;
    

    这个逻辑(当然不是WITH CUBE)在 Teradata 和 Hive 中都可以工作。

    否则,如果你确实有 NULL 值,你可以使用GROUPING__ID:

    SELECT fact_1_id,
           fact_2_id,
           SUM(sales_value) AS sales_value,
           (case when (CAST (GROUPING__ID AS INT) & 1) = 0 then 1 else 0 end) as f1g,
           (case when (CAST (GROUPING__ID AS INT) & 2) = 0 then 1 else 0 end) as f2g
    FROM   dimension_tab
    GROUP BY fact_1_id, fact_2_id WITH CUBE
    ORDER BY fact_1_id, fact_2_id;
    

    注意:GROUPING__ID 取决于 group by 中表达式的顺序,因此重新排列 group by 可以改变标志的含义。

    【讨论】:

    • 感谢@Gordon .... 详细解答。只是为了确认我是否正确......即使订单发生变化......我们需要相应地更改'&N'并且在所有情况下都会完美。
    • @Sanjiv 。 . . & 后面的“N”值是 group by 中表达式的 2^ 位置。为什么 Hive 不只是做正确的事并创建了 grouping() 函数,我不知道。 SQL 编译器应该知道group by 表达式的顺序。
    • 是的,为同样的问题提出了 HIVE JIRA。 issues.apache.org/jira/browse/HIVE-10310
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-02-07
    相关资源
    最近更新 更多