大数据之hive:hive新功能之GROUPING SETS,Cube, Rollup

一、GROUPING SETS

1、概述

GROUPING SETS作为GROUP BY的子句,可以简单理解为多条group by语句通过union all把查询结果聚合起来;

2、实战

查看表test_03字段

hive (default)> desc test_03;
OK
col_name	data_type	comment
user_id             	bigint              	                    
device_id           	int                 	                    
os_id               	int                 	                    
app_id              	int                 	                    
--sql1
select device_id,os_id,app_id,count(user_id) from  test_03 group by device_id,os_id,app_id grouping sets((device_id)) 
--等价于sql1
SELECT device_id,null,null,count(user_id) FROM test_03 group by device_id

--sql2
select device_id,os_id,app_id,count(user_id) from  test_03 group by device_id,os_id,app_id grouping sets((device_id,os_id))	
--等价于sql2
SELECT device_id,os_id,null,count(user_id) FROM test_03 group by device_id,os_id
--sql3
select device_id,os_id,app_id,count(user_id) from  test_03 group by device_id,os_id,app_id grouping sets((device_id,os_id),(device_id))
--等价于sql3
SELECT device_id,os_id,null,count(user_id) FROM test_03 group by device_id,os_id 
UNION ALL 
SELECT device_id,null,null,count(user_id) FROM test_03 group by device_id
--sql4
select device_id,os_id,app_id,count(user_id) from  test_03 group by device_id,os_id,app_id grouping sets((device_id),(os_id),(device_id,os_id),())
--等价于sql4	
SELECT device_id,null,null,count(user_id) FROM test_03 group by device_id 
UNION ALL 
SELECT null,os_id,null,count(user_id) FROM test_03 group by os_id 
UNION ALL 
SELECT device_id,os_id,null,count(user_id) FROM test_03 group by device_id,os_id  
UNION ALL 
SELECT null,null,null,count(user_id) FROM test_03

二、Cube

1、概述

cube简称数据魔方,可以实现hive多个任意维度的查询,cube(a,b,c)则首先会对(a,b,c)进行group by,然后依次是(a,b),(a,c),(a),(b,c),(b),©,最后在对全表进行group by,它会统计所选列中值的所有组合的聚合;

2、实战

select device_id,os_id,app_id count(user_id) 
from test_xinyan_reg 
group by device_id,os_id,app_id with cube;

--共有3^0+3^1+3^2+3^3=8种可能,如果维度增大,代码量显著增加
SELECT device_id,null,null ,count(user_id) FROM test_03 group by device_id
UNION ALL
SELECT null,os_id,null,count(user_id) FROM test_xinyan_reg group by os_id
UNION ALL
SELECT device_id,os_id,null,count(user_id) FROM test_xinyan_reg group by device_id,os_id
UNION ALL
SELECT null,app_id,null,count(user_id) FROM test_xinyan_reg group by app_id
UNION ALL
SELECT device_id,null,app_id ,count(user_id) FROM test_xinyan_reg group by device_id,app_id
UNION ALL
SELECT null,os_id,app_id,count(user_id) FROM test_xinyan_reg group by os_id,app_id
UNION ALL
SELECT device_id,os_id,app_id,count(user_id) FROM test_xinyan_reg group by device_id,os_id,app_id
UNION ALL
SELECT null,null,null count(user_id) FROM test_xinyan_reg group by client_version

三、Rollup

1、概述

rollup可以实现从右到做递减多级的统计,显示统计某一层次结构的聚合。

2、实战

--sql1
 select device_id,os_id,app_id,count(user_id) 
from test_xinyan_reg 
group by device_id,os_id,app_id with rollup;
--等价于sql1
select device_id,os_id,app_id,count(user_id) 
from test_xinyan_reg 
group by device_id,os_id,app_id,client_version,from_id 
grouping sets ((device_id,os_id,app_id),(device_id,os_id),(device_id),());

四、Grouping_ID函数

当我们没有统计某一列时,它的值显示为null,这可能与列本身就有null值冲突,这就需要一种方法区分是没有统计还是值本来就是null,grouping_id其实就是所统计各列二进制和;
比如表test_04有两个字段id,type;

idtype
11
1null
21
32
3null
SELECT id, type, GROUPING__ID, count(*) from test_04 GROUP BY id, type  grouping sets((id, type),(id)) order by GROUPING__ID;
--结果如下
id	type	grouping__id	_c3
3	2	0	1
2	1	0	1
1	NULL	0	1
1	1	0	1
3	NULL	0	1
3	NULL	1	2
1	NULL	1	2
2	NULL	1	1

grouping_id计算方法
grouping sets 中的每一种粒度,都对应唯一的 grouping__id 值,其计算公式与 group by 的顺序、当前粒度的字段有关。
序号 grouping set 给倒序排列的字段(sex class)赋值 对应的十进制(grouping__id 的值)

1 id 01 1
2 id,type 00 0
这就是上面 grouping sets 的结果中 grouping__id 值的由来。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值