hive中的高阶函数:with cube函数,Grouping sets函数,With rollup函数

1.应用背景:

实际生产中,各种指标的报表统计,往往都会涉及到多维分析,比如,统计日活数,日会话次数,日回头访客数,日新,日用户平均访问时长,访问深度……都需要从不同维度,各种角度去分析,如果上述维度分析需求,都逐个开发计算sql(逐个去group by聚合),工作繁冗!

那么,如何解决这个问题呢?

2.实现过程:

2.1 关键要点:

  1.  创建一个统一的目标维度分析聚合结果表,这个表应该包含所有的维度字段
  2.  利用hive的高阶聚合函数,在一个sql中,即可计算出所有可能的维度组合

2.2 Cube表模型:这种表,在业内通常被称之为: cube (多维数据立方体)

手机型号

操作系统

App版本

下载渠道

小时段

日活总数

江西

\n

\n

\n

\n

\n

\n

\n

1000

江苏

\n

\n

\n

\n

\n

\n

\n

1500

河南

\n

\n

\n

\n

\n

\n

\n

1800

……

 

 

 

 

 

 

 

 

江西

九江

\n

\n

\n

\n

\n

\n

800

江西

赣州

\n

\n

\n

\n

\n

\n

600

江西

南昌

\n

\n

\n

\n

\n

\n

450

江西

……

\n

\n

\n

\n

\n

\n

550

江苏

南通

\n

\n

\n

\n

\n

\n

660

江苏

苏州

\n

\n

\n

\n

\n

\n

540

江苏

徐州

\n

\n

\n

\n

\n

\n

400

江苏

……

\n

\n

\n

\n

\n

\n

320

\n

\n

\n

MI6

\n

\n

\n

\n

1500

\n

\n

\n

MI8

\n

\n

\n

\n

2200

\n

\n

\n

MATE10

\n

\n

\n

\n

1800

\n

\n

\n

IPHONE6

\n

\n

\n

\n

1200

\n

\n

\n

……

\n

\n

\n

\n

……

 

 

 

 

 

 

 

 

 

 2.3 如果我要从上面的表中,获取到 各省份日活数,如何获取?

SELECT

province,

dau_cnt

FROM cube

WHERE province is not null  and coalesce(city,district,devicetype,osname,....) is null

2.4 什么是维度的基数?

上述表的行数很大

比如按(省、市、区、手机型号、app版本、下载渠道、小时段)维度组合计算日活数,结果行数有:  省维度的基数市维度的基数 * 区维度的基数 * ……

基数: 就是某个维度字段的去重值个数!

3. hive为解决以上问题所提供的高阶函数:

3.1 With cube函数:将所有可能要参与维度的字段都写在group by 后面,with cube 函数就会自动的将所有各种维度都统计出来

INSERT INTO TABLE cube
SELECT
province,
city,
district,
device_type,
os_name,
app_version,
release_channel,
hour_segement,
count(distinct guid) as dau_cnt
FROM  t_src
GROUP BY
province,
city,
district,
device_type,
os_name,
app_version,
release_channel,
house_segment
WITH CUBE
;

3.2  Grouping sets函数:这个可以由用户自己决定需要哪些维度组合,将自己需要的维度组合都写在Grouping sets函数后

INSERT INTO TABLE cube
SELECT
province,
city,
district,
device_type,
os_name,
app_version,
release_channel,
hour_segement,
count(distinct guid) as dau_cnt
FROM  t_src
GROUP BY 
province,
city,
district,
device_type,
os_name,
app_version,
release_channel,
house_segment
GROUPING SETS(
(),
(province),
(province,city),
(province,city,district),
(device_type)
)
;

3.3 With rollup函数:主要针对层级维度的组合处理,假如现在的组合是省+市+区三个维度进行组合,with rollup 就会自动的一级一级往上卷,变成省+市,最后是省

INSERT INTO TABLE cube
SELECT
province,
city,
district,
device_type,
os_name,
app_version,
release_channel,
hour_segement,
count(distinct guid) as dau_cnt
FROM  t_src
GROUP BY province,city,district
WITH ROLLUP
;

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值