Hive之Grouping Sets函数[详解]

前言

在一个GROUP BY 查询中,根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果进行UNION ALL操作。


常规写法

SELECT a,b,sum(num) AS total_num
  FROM DW_AAA.BBB
 GROUP BY a,b
 UNION ALL
SELECT a,sum(num) AS total_num
  FROM DW_AAA.BBB
 GROUP BY a
 UNION ALL 
SELECT b,sum(num) AS total_num
  FROM DW_AAA.BBB
GROUP BY B

GROUPING SETS进行改写:

使用方法 :

select
    A,
    B,
    C,
    group_id, 
    count(A)
from
    tableName
group by  --declare columns
    A,
    B,
    C
grouping sets
(
   (A,C),
   (A,B),
   (B,C),
   (C)
)

grouping_id在 hivesql 和 sparksql 里二进制的生成方法和规则

hive中的grouping_id的数字规则

select a,b,c,grouping__id from test group by a,b,c
grouping sets ((ab),(ac),(abc))
规则:根据group by 字段 ,从低到高,group sets中出现的字段是1没出现是0
如 (a,b)对应 011
(a,c)对应 101

spark中的grouping_id()的数字规则

select a,b,c,grouping__id() from test group by a,b,c
grouping sets ((ab),(ac),(abc))
规则:根据group by 字段 ,从高到低,group sets中出现的字段是0没出现是1
如 (a,b)对应 001
( a,c)对应 010

注 :在Hive2.3.0和之后的版本中,0和1的规则是相反的。


总结

如果此篇文章有帮助到您, 希望打大佬们能关注点赞收藏评论支持一波,非常感谢大家!
如果有不对的地方请指正!!!

参考1
参考2

猜你喜欢

转载自blog.csdn.net/weixin_42326851/article/details/131855168