HQL语法优化之group by

开发环境:
CDP 7.1.4
Hive 3.1.3

1. 执行流程

Hive未经优化的分组聚合,只通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将具有相同分组字段值的数据发送到同一个Reduce端,各组数据在Reduce端完成最终的聚合运算。

2. 优化思路

分组聚合的优化思路主要围绕减少Shuffle数据量进行,具体做法采用Map-Side聚合。
Map-Side聚合是在Map端维护一个哈希表(也叫散列表,英文:Hash Table,是根据关键码值(key-value)而直接进行访问的数据结构),利用哈希表完成部分的聚合,然后将部分聚合的结果,按照分组字段分区,通过Shuffle,将具有相同分组字段值的数据发送到同一个Reduce端,各组数据在Reduce端完成最终的聚合运算。
Map-Side聚合的相关参数如下:

-- 启动Map-Side聚合
set hive.map.aggr = true;
-- 检测源表数据是否适合启动Map-Side聚合
-- 检测方法:先对若干条数据进行Map-Side聚合,若聚合后的数据条数与聚合之前的数据条数比值小于该值,则认为该表适合进行Map-Side聚合;否则,认为该表不适合进行Map-Side聚合,后续也就不再进行Map-Side聚合
set hive.map.aggr.hash.min.reduction = 0.5;
-- 用于检测源表是否适合进行Map-Side聚合的数据条数
set hive.groupby.mapaggr.checkinterval = 100000;
-- Map-Side聚合所用的Hash Table占用Map Task堆内存的最大比例,若超出该值,则会对Hash Table进行一次Flush
set hive.map.aggr.hash.force.flush.memory.threshold = 0.9;

3. 优化案例

3.1. 未经优化的执行

set hive.map.aggr = false;

EXPLAIN
SELECT app,
       count(1)
FROM tmp.op_user_device_day
WHERE dt = '20230131'
GROUP BY app;

执行计划如下:
在这里插入图片描述

3.2. 优化后的执行

set hive.map.aggr = true;

EXPLAIN
SELECT app,
       count(1)
FROM tmp.op_user_device_day
WHERE dt = '20230131'
GROUP BY app;

执行计划如下:
在这里插入图片描述
优化后的执行计划比优化前的执行计划多了一个Map端Group By Operator操作,也就是Map端部分聚合操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bigdata_han

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值