hive增强的聚集,魔方,分组和汇总

本文档介绍了增强聚集功能,为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增加了改善。

GROUPING SETS子句

分组集子句中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

Grouping_ID功能

当显示为列聚集其值为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),(一),())。

 

hive.new.job.grouping.set.cardinality

是否有新的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作业下所添加的
假设原单组由将减小数据大小。

 

你可能感兴趣的:(hive)