Hive Cube, Grouping 和 Rollup 的功能和优化

GROUPING SETS 的使用

GROUPING SETS 在 GROUP BY 中,允许同一份记录集合按多种 group by 选项。所有的 GROUPING SET 等价于 多个 GROUP BY 的结果用 UNION 连接起来。GROUPING SET 中,空的集合()代表是全局的汇聚。

表1 – Grouping set 查询和等价的 GROUP BY 汇聚查询

GROUPING SETS 汇聚查询等价的 group by查询
SELECT a, b, SUM© FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) )SELECT a, b, SUM© 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)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), 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

RULL UP

RULL UP 代表按层级进行汇总。
如 GROUP BY a, b, c WITH RULL UP 等价于 GROUP BY a, b, c GROUPING SETS ((a, b, c),(b, c), (a), ())

CUBE

CUBE 按所有的可能的汇聚组合进行汇聚
如 GROUP BY a, b, c WITH CUBE 等价于 GROUP BY a, b, c GROUPING SETS (( a, b, c), (a, b), (b, c), (a, c), a, b, c, ());

GROUPING__ID 函数

如有表 T 内容如下:

Column1(key)Column2(value)
1NULL
12
22
33
3NULL
45

建表和插入数据的 SQL 如下:

create table t1(key int, value int);
insert into t1 values(1,null),(1,1),(2,2),(3,3),(3,null),(4,5);

检索 SQL

select key,value,count(*) from t1 group by key,value with rollup;
keyvaluecount
1NULL1
111
2NULL1
4NULL1
451
NULLNULL6
1NULL2
221
3NULL1
3NULL2
331

请看第1行为 1 null 1,第 7 行为 1 null 21 null 1 是按 (key, value)这两个字段 group by 的结果,1 null 2 是按 key group by 的结果,没有按 value 进行 group by。
从数据上不好区分,GROUPING__ID 用于区分某一列本身是 null,还是没按此字段汇聚。
GROUPING__ID 返回一个位向量,进行汇聚的列对应位置是1,否则是 0。按列进行汇聚,此列的 null 值没有意义。
如 group by key, value,则对应的表格如下。

GROUP BY key?GROUP BY value?bit vectorGROUPING__ID
000
011
102
113

GROUP__ID 示例

select key,value,grouping__id,count(*) from t1 group by key,value with rollup;
keyvalueGOUPING_IDcount
1NULL01
1101
2NULL11
4NULL11
4501
NULLNULL36
1NULL12
2201
3NULL01
3NULL12
3301

请看第1行为 1 null 0 1,第 7 行为 1 null 1 2
第 1 列的 GROUPING_ID 为 0,代表 1 null 分别对应列的值,列的值有意义。
第 1 列的 GROUPING_ID 为 1,对应的二进制为 01,说明 key 对应的是 0,value 对应的是1。说明 key 对应的列有意义,value 对应的 NULL 不对应真实数据,没有意义。

GROUPING 函数

GROUPING__ID 按GROUP BY 列的顺序显示对应的位向量的值,GROUPING 函数可以指定列和列的顺序

SELECT key, value, GROUPING__ID, grouping(key, value), grouping(value, key), grouping(key), grouping(value) 
FROM t1 
GROUP BY key, value
WITH ROLLUP;
keyvalueGROUPING__IDgrouping(key,value)grouping(value,key)grouping(key)grouping(value)
1NULL00000
1100000
2NULL11201
4NULL11201
4500000
NULLNULL33311
1NULL11201
2200000
3NULL00000
3NULL11201
3300000

可以看到,GROUPING__ID 和 grouping(key, value) 的值完全相同。
第 3 行,grouping(key) 为0, grouping(value)为1,grouping(key, value) 对应的二进制为 01,所以10 进制为 1。grouping(value, key) 对应的二进制为 10,所以10 进制为 2。

hive.new.job.grouping.set.cardinality

超过此限额的 group by 组合,使用新的 作业。
如 SQL select a, b, c, count(1) from T group by a, b, c with rollup; Map 端对于每条数据,生成 4 条数据 (a, b, c), (a, b, null), (a, null, null), (null, null, null),每条记录加上对应的 GROUPING__ID,导致 map 输出的数据量膨胀,而 map 端的汇聚不能有效减少数据量。
以上SQL 的 group by 的组合的数量是 4,没有到 30,所以只用一个作业完成计算。

 <property>
    <name>hive.new.job.grouping.set.cardinality</name>
    <value>30</value>
    <description>
      Whether a new map-reduce job should be launched for grouping sets/rollups/cubes.
      For a query like: select a, b, c, count(1) from T group by a, b, c with rollup;
      4 rows are created per row: (a, b, c), (a, b, null), (a, null, null), (null, null, null).
      This can lead to explosion across map-reduce boundary if the cardinality of T is very high,
      and map-side aggregation does not do a very good job. 
      
      This parameter decides if Hive should add an additional map-reduce job. If the grouping set
      cardinality (4 in the example above), is more than this value, a new MR job is added under the
      assumption that the original group by will reduce the data size.
    </description>
  </property>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值