Hive之GroupingSets函数
groupby是什么函数最近在看⼀些关于Hive优化的东西,看到⼀个很好⽤的函数:Grouping Sets函数,今天就先总结⼀下关于这个函数的⽤法!
在⼀个GROUP BY 查询中,根据不同的维度组合进⾏聚合,等价于将不同维度的GROUP BY结果进⾏UNION ALL操作。GROUPING SETS就是⼀种将多个GROUP BY逻辑UNION写在⼀个HIVE SQL语句中的便利写法。GROUPING SETS会把在单个GROUP BY逻辑中没有参与GROUP BY的那⼀列置为NULL值,这样聚合出来的结果,未被GROUP BY的列将显⽰为NULL。
使⽤⽅法:
假如现在⼜如下场景,a,b,num三个字段,现在要求对a,b字段分别进⾏统计,有三种情况:(a,b)、(a)、(b)。常规写法我们可能会写成:
SELECT a,b,sum(num) AS total_num
FROM DW_AAA.BBB
GROUP BY a,b
UNION ALL
SELECT a,sum(num) AS total_num
FROM DW_AAA.BBB
GROUP BY a
UNION ALL
SELECT b,sum(num) AS total_num
FROM DW_AAA.BBB
GROUP BY b
现在⽤GROUPING SETS来进⾏改写:
SELECT a
,b
,
sum(num) AS total_num
FROM DW_AAA.BBB
GROUP BY a,b
GROUPING SETS (a,b),(a),(b)
可见代码简洁了很多,并且⽣成的job数也变少且计算的效率提⾼了(UNION ALL是多次扫描表)。
下⾯看⼀个案例:
有如下店铺销售数据:
现有如下需求:按照店铺id和⽇期维度汇总订单量
代码如下:
SELECT businessid
,date
,count(DISTINCT orderid) AS ord_num
FROM dw_business.basic_info_detail a
GROUP BY date,businessid
grouping sets((date,businessid),(businessid))
得到结果如下:
从结果中可以看出,businessid为344981的店铺,其订单量为1174,并且在⼆⽉份产单1096单,在3⽉份为78单。注:
hive中grouping sets 数量较多时如何处理?
可以使⽤如下设置来
uping.set.cardinality = 30;
这条设置的意义在于告知解释器,group by之前,每条数据复制量在30份以内。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论