从hive 0.10版本开始,Hive支持group by rollup and cube。
https://issues.apache.org/jira/browse/HIVE-3433
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUPBY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUPBY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。
也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。
Hive中要使用rollup和cube功能,目前必须设置hive.map.aggr参数为true才可以。
至于不添加参数的版本,现在还没有实现,
https://issues.apache.org/jira/browse/HIVE-3508
set hive.map.aggr=true;
selectkey,value from T1:
1,11
2,12
3,13
7,17
8,18
8,28
SELECT key,val, count(1) FROM T1
1 1
2 1
3 1
7 1
8 2
SELECT key,val, count(1) FROM T1 GROUP BY key, val with cube
NULL NULL 6
NULL 11 1
NULL 12 1
NULL 13 1
NULL 17 1
NULL 18 1
NULL 28 1
1 NULL 1
1 11 1
2 NULL 1
2 12 1
3 NULL 1
3 13 1
7 NULL 1
7 17 1
8 NULL 2
8 18 1
8 28 1
从上面的结果可以看到
NULL NULL 6 这个是group by全表的结果
NULL 11 1
NULL 12 1
NULL 13 1
NULL 17 1
NULL 18 1
NULL 28 1
这几行结果是对val进行group by的结果
1 NULL 1
2 NULL 1
3 NULL 1
7 NULL 1
8 NULL 2
这几行是对key进行group by的结果
可以看到,cube是分别对(key),( val) ,(key,val)和全表都进行了group by。
SELECT key,count(distinct val) FROM T1 GROUP BY key with rollup
NULL NULL 6
1 NULL 1
1 11 1
2 NULL 1
2 12 1
3 NULL 1
3 13 1
7 NULL 1
7 17 1
8 NULL 2
8 18 1
8 28 1
同样
NULL NULL 6是对全表进行group by的结果
1 NULL 1
2 NULL 1
3 NULL 1
7 NULL 1
8 NULL 2
这几行记录是对key进行group by的结果
可以看出,rollup,就是对(key),(key,val)和全表进行group by