1.说明
在一个GROUP BY查询中,根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL
2.grouping sets的优缺点
优点:GROUPING SETS在遇到多个条件时,聚合是一次性从数据库中取出所有需要操作的数据,在内存中对数据库进行聚合操作并生成结果,而不会像GROUP BY多次扫描表后进行UNION操作。这也就是为什么GROUPING SETS和UNION操作所返回的数据顺序是不同的
缺点:
使用union操作会增加IO开销,会减少cpu和内存的开销,使用grouping sets会减少IO开销,会增加cpu和内存的消耗
等价关系
等价情况一
GROUP BY GROUPING SETS (A,B,C)
等价于
GROUP BY A
UNION ALL
GROUP BY B
UNION ALL
GROUP BY C
等价情况二
GROUP BY GROUPING SETS ((A,B,C))
等价于
GROUP BY A,B,C
--------------------------------
GROUP BY GROUPING SETS (A)
,GROUPING SETS (B)
,GROUPING SETS (C)
等价于
GROUP BY A,B,C
--------------------------------
GROUP BY GROUPING SETS (A)
,GROUPING SETS ((B,C))
等价于
GROUP BY A,B,C
--------------------------------
GROUP BY A,B
,GROUPING SETS ((B,C))
等价于
GROUP BY A,B,C
等价情况三
GROUP BY GROUPING SETS (A,(B,C))
等价于
GROUP BY A
UNION ALL
GROUP BY B,C
等价情况四
GROUP BY GROUPING SETS (A)
,GROUPING SETS (B,C)
等价于
GROUP BY A,B
UNION ALL
GROUP BY A,C
等价情况五
GROUP BY A,B
, GROUPING SETS (B,C)
等价于
GROUP BY A B C
UNION ALL
GROUP BY A,B
等价情况六
GROUP BY A,B,C
,GROUPING SETS(B,C)
等价于
GROUP BY A,B,C
UNION ALL
GROUP BY A,B,C
后话
hive中grouping sets 数量较多时如何处理?
可以使用如下设置来:
set hive.new.job.grouping.set.cardinality = 30;
这条设置的意义在于告知解释器,group by之前,每条数据复制量在30份以内。