Group by cube and rollup in Hive 0.10


从hive 0.10版本开始,Hive支持group by rollup and cube。

https://issues.apache.org/jira/browse/HIVE-3433

 

1.  rollup和cube区别:(来自oracle)

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),…… 这样任意按自己想要的形式结合统计数据,非常方便。

2.  Hive中使用rollup和cube

Hive中要使用rollup和cube功能,目前必须设置hive.map.aggr参数为true才可以。

至于不添加参数的版本,现在还没有实现,

https://issues.apache.org/jira/browse/HIVE-3508

3.  代码示例

a)  普通查询示例

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


b)  Cube示例

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。

c)  Rollup示例

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

你可能感兴趣的:(hive)