hive SQL group by rollup && cube && grouping sets
参考链接:
SQL:
group by :
https://blog.csdn.net/make_1998/article/details/82938038
https://blog.csdn.net/weixin_44112790/article/details/117129217
https://www.cnblogs.com/chenzechao/p/11273980.html
【hive 】cube 和 roll up https://www.cnblogs.com/zzhangyuhang/p/9986506.html
group by:
group by rollup:
group by cube:
hive SQL:
group by: 是一个压缩过程
group by with cube:
参考:https://www.cnblogs.com/zzhangyuhang/p/9986506.html
cube(数据立方体),对多个维度进行聚合(group)
hive 也有 cube,实现多个任意维度的查询
1. cube(a,b,c) 首先对(a,b,c) 进行group by,
2. 然后依次是(a,b),(a,c),(a),(b,c),(b),©,最后对全表进行group by,会统计所选列中值的所有组合的聚合
3. cube 可以对所有维度进行聚合(group by)
select
col1,col2,col3, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0’) as sign --对其二进制化就能明白了,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3 --维度字段都要出现在group by中,这里不能使用1,2,3代替
with cube; --使用cube函数
使用cube 聚合函数后,可以 根据 grouping_id(二进制表示形式【反向】)看出 当前 group by 字段维度:
如:sign = 100,表示只有col1一个维度 参与group by;
sign = 110,表示只有 col1 和 col2 两个维度参与 group by
grouping by sets:
当不需要cube将所有维度都列出来的时候,只需要部分维度的时候,可以使用grouping sets
select
col1,col2,col3, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,‘0’) --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table group by col1,col2,col3 --维度字段都要出现在group by中,并不能省略暂时不用到的字段,这里不能使用1,2,3,4代替
grouping sets(col1,(col2,col3)); --使用grouping sets来代替with cube
tips:
使用grouping sets() 进行指定维度聚合的时候,仅仅聚合给出的维度组合,并不会自动帮你 组合维度
如:grouping sets(col1, (col2,col3)) 只聚合 col1 维度和 (col2,col3)维度,并不会自动 聚合 (col1,col2,col3)维度
group by with rollup:
rollup 卷起,rollup是cube的子集,以最左侧维度为主,按照顺序依次进行聚合
如:聚合维度为:col1,col2,col3 使用rollup 聚合的字段分别为 col1, (col1,col2), (col1,col3), (col1,col2,col3)
select
col1,col2,col3,col4, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),4,‘0’) --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3,col4 --维度字段都要出现在group by中,这里不能使用1,2,3,4代替
with rollup; --使用rollup函数
结果分析:
在 CUBE 或 ROLLUP 等操作中,所生成的 NULL 代表全体值,所以在cube 和 rollup 时,数据本身存在 null 的情况,需要将数据中的null 提前 处理。
可使用 nvl(col1,’ALL’) 或者 COALESCE(col1, ‘ALL')
总结:
更多推荐
所有评论(0)