本文档介绍了增强聚集功能,为GROUP BY的SELECT语句子句。
GROUPING SETS子句
Grouping_ID功能
多维数据集和汇总
hive.new.job.grouping.set.cardinality
【版本】
分组集,CUBE和汇总运算符和函数GROUPING__ID分别加入hive0.10.0。
见HIVE-2397,HIVE-3433,HIVE-3471,和HIVE-3613。
另请参阅HIVE-3552在配置单元0.11.0增加了改善。
分组集子句中GROUP BY让我们可以指定多个GROUP BY在同一个记录集选项。所有分组集子句在逻辑上可以表示为几个方面GROUP由UNION连接查询。表1示出几个这样的等效的语句。这是在形成分组集条款的想法很有帮助。空白组()在分组集条款计算总集合。
表1 - 分组集查询,相当于GROUP BY查询
汇总查询与GROUPING SETS |
相当于汇总查询与GROUP BY |
SELECT a,b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS (a,b) |
SELECT a, null, SUM( c ) FROM tab1 GROUP BY a UNION SELECT null, b, SUM( c ) FROM tab1 GROUP BY b |
SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) ) |
SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a) |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b UNION SELECT a, null, SUM( c ) FROM tab1 GROUP BY a |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) ) |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b UNION SELECT a, null, SUM( c ) FROM tab1 GROUP BY a, null UNION SELECT null, b, SUM( c ) FROM tab1 GROUP BY null, b UNION SELECT null, null, SUM( c ) FROM tab1 |
当显示为列聚集其值为null。这可能会发生冲突的情况下本身有一定的空值的列。需要有一些方法来确定在列空的,这意味着骨料和NULL列,这意味着值。GROUPING_ID功能是解决这一点。
该函数返回相应于各列中是否存在或不是一个位向量。对于每一列,“1”的值产生一个行中结果集如果该列已聚集在该行,否则为“0”。这可以被用来当有零点来区分中的数据。
考虑下面的例子
Column1 (key) |
Column2 (value) |
1 |
NULL |
1 |
1 |
2 |
2 |
3 |
3 |
3 |
NULL |
4 |
5 |
下面的查询
SELECT key, value, GROUPING__ID,count(*) from T1 GROUP BY key, value WITH ROLLUP
will have the following results.
|
|
|
|
NULL |
NULL |
0 |
6 |
1 |
NULL |
1 |
2 |
1 |
NULL |
3 |
1 |
1 |
1 |
3 |
1 |
2 |
NULL |
1 |
1 |
2 |
2 |
3 |
1 |
3 |
NULL |
1 |
2 |
3 |
NULL |
3 |
1 |
3 |
3 |
3 |
1 |
4 |
NULL |
1 |
1 |
4 |
5 |
3 |
1 |
注意,第三列是列的被选择一个位向量。
对于第一行,没有任何列被选中。
对于第二行,只有第一列被选择,这可以解释为2的计数。
对于第三行,无论是列被选择(和第二列恰好是空),这解释为1计数。
Cubesand Rollups
一般语法是WITH CUBE/汇总。它是用来与GROUP BY只。CUBE创建在其参数集列的所有可能的组合小计。一旦我们计算一组尺寸的立方体,我们可以得到答案,在这些方面都可能聚集的问题。
这可能是另外值得一提的是,
GROUP BY A,B,C WITHCUBE相当于
GROUP BY a, b, c GROUPING SETS ( (a, b, c),(a, b), (b, c), (a, c), (a), (b), (c), ( )).
ROLLUP子句使用GROUP BY来计算聚集在一个维度的层级。
GROUP BY A,B,C与ROLLUP假定层次是“一个”向下钻取到“B”向下钻取到“C”。
GROUP BY A,B,C,同时汇总是相当于GROUP BY A,B,C GROUPING SETS((A,B,C),(A,B),(一),())。
是否有新的map-reduce作业应为分组集/汇总/立方推出。
对于类似的查询:选择A,B,C,COUNT(1)T组由A,B,C与汇总;
4行,每行创建:(A,B,C),(A,B,空),(A,NULL,NULL),(NULL,NULL,NULL)
这可能会导致爆炸跨地图,减少边界如果T的基数非常高
和地图端聚合不会做了很好的工作。
这个参数决定是否应在hive添加一个额外的map-reduce作业。如果分组集
(在上面的实施例4),超过此值基数,一个新的MR作业下所添加的
假设原单组由将减小数据大小。