Hive 中分组聚合的常用子句是 Group By;在执行过程中,将 Group By 的字段组合为map的输出key值,利用 MapReduce 的排序,在reduce阶段保存LastKey区分不同的key;如果 Group By 的字段组合出现了数据分布不均匀,就会导致 Hive 数据倾斜;另外 Group By 一般与聚合函数一起使用,比如 SUM() 和 COUNT() 等。

0x00 Group By 典型场景

假设有一张表 dwd_bhv_log_di(logid,uuid,city,provice,dt),需求是统计每个省份的UV与PV;

1
2
3
4
5
---常规实现方式
select provice, count(distinct uuid) uv, count(logid) pv
from dwd_bhv_log_di
where dt = '2019-11-10'
group by provice;

0x01 Group By 优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set hive.map.aggr=true;
set mapred.reduce.tasks=10;
set hive.groupby.skewdata=true;

select provice, sum(part_uv) uv, sum(part_pv) pv
from (
select provice, part, count(uuid) part_uv, sum(part_pv) part_pv
from (
select provice, uuid, count(logid) part_pv, ceil(rand()*100) part
from dwd_bhv_log_di
where dt = '2019-11-10'
group by provice, uuid
) t1
group by provice, part
) t2
group by provice;

参考文献

MapReduce执行过程详解
HiveQL的Select语句
Hive Group By的实现原理