Hive 0.10 支持cube rollup

从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)  普通查询示例

[sql] view plain copy
  1. set hive.map.aggr=true;  
  2. selectkey,value from T1:  
  3. 1,11  
  4. 2,12  
  5. 3,13  
  6. 7,17  
  7. 8,18  
  8. 8,28  
  9. SELECT key,val, count(1) FROM T1  
  10. 1  1  
  11. 2  1  
  12. 3  1  
  13. 7  1  
  14. 8  2  


b)  Cube示例

[sql] view plain copy
  1. SELECT key,val, count(1) FROM T1 GROUP BY key, val with cube  
  2.    
  3. NULL  NULL  6  
  4. NULL  11 1  
  5. NULL  12 1  
  6. NULL  13 1  
  7. NULL  17 1  
  8. NULL  18 1  
  9. NULL  28 1  
  10. 1  NULL  1  
  11. 1  11 1  
  12. 2  NULL  1  
  13. 2  12 1  
  14. 3  NULL  1  
  15. 3  13 1  
  16. 7  NULL  1  
  17. 7  17 1  
  18. 8  NULL  2  
  19. 8  18 1  
  20. 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示例

[sql] view plain copy
  1. SELECT key,count(distinct val) FROM T1 GROUP BY key with rollup  
  2. NULL  NULL  6  
  3. 1  NULL  1  
  4. 1  11 1  
  5. 2  NULL  1  
  6. 2  12 1  
  7. 3  NULL  1  
  8. 3  13 1  
  9. 7  NULL  1  
  10. 7  17 1  
  11. 8  NULL  2  
  12. 8  18 1  
  13. 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


自:http://blog.csdn.net/cxhzqhzq/article/category/1320462

你可能感兴趣的:(Hive)