当前位置:   article > 正文

Hive之Grouping Sets函数_hive group set

hive group set

最近在看一些关于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)。常规写法我们可能会写成:

  1. SELECT a,b,sum(num) AS total_num
  2. FROM DW_AAA.BBB
  3. GROUP BY a,b
  4. UNION ALL
  5. SELECT a,sum(num) AS total_num
  6. FROM DW_AAA.BBB
  7. GROUP BY a
  8. UNION ALL
  9. SELECT b,sum(num) AS total_num
  10. FROM DW_AAA.BBB
  11. GROUP BY b

现在用GROUPING SETS来进行改写:

  1. SELECT a
  2. ,b
  3. ,sum(num) AS total_num
  4. FROM DW_AAA.BBB
  5. GROUP BY a,b
  6. GROUPING SETS (a,b),(a),(b)

可见代码简洁了很多,并且生成的job数也变少且计算的效率提高了(UNION ALL是多次扫描表)。

下面看一个案例:

有如下店铺销售数据:

现有如下需求:按照店铺id和日期维度汇总订单量

代码如下:

  1. SELECT businessid
  2. ,date
  3. ,count(DISTINCT orderid) AS ord_num
  4. FROM dw_business.basic_info_detail a
  5. GROUP BY date,businessid
  6. grouping sets((date,businessid),(businessid))

得到结果如下:

从结果中可以看出,businessid为344981的店铺,其订单量为1174,并且在二月份产单1096单,在3月份为78单。

注:

hive中grouping sets 数量较多时如何处理? 

可以使用如下设置来

set hive.new.job.grouping.set.cardinality = 30;

这条设置的意义在于告知解释器,group by之前,每条数据复制量在30份以内。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号