基础数据
我们使用电商网站用户行为数据进行测试,数据格式如下:
-- 用户行为数据
CREATE TABLE `tmp.log_user_behavior`(
`user_id` string COMMENT '用户id',
`item_id` string COMMENT '商品id',
`category_id` string COMMENT '商品分类id',
`behavior` string COMMENT '行为',
`ts` date COMMENT '行为发生时间')
PARTITIONED BY (
`date` string)
231758,3622677,4758477,pv
92253,642337,4135185,pv
297958,1762578,4801426,pv
786771,1940649,1320293,pv
789048,3144191,2355072,pv
895384,1138468,1602288,pv
578800,1324176,4135836,pv
886777,4606952,996587,pv
Group by执行原理分析
Group By任务转化为MR任务的流程如下:
- Map:生成键值对,以
GROUP BY条件中的列作为Key,以聚集函数的结果作为Value - Shuffle:根据
Key的值进行 Hash,按照Hash值将键值对发送至不同的Reducer中 - Reduce:根据
SELECT子句的列以及聚集函数进行Reduce
Group by执行计划分析
在不进行任何参数调整的情况下,Group By会分为Map和Reduce两个阶段,Map阶段扫描表按照需要聚合的字段,形成K-V对,在Reduce阶段会对相同的K进行Agg操作,执行计划如下所示:
hive> set hive.map.aggr=false;
hive> explain select user_id, item_id, count(*) from tmp.log_user_behavior where date='20200831' group by user_id, item_id;
OK
STAGE DEPENDENCIES:
Stage-1 is a root stage -- Stage-1是Map-Reduce阶段
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree: -- Map
TableScan -- 扫描表
alias: log_user_behavior --- 表名
Statistics: Num rows: 34021 Data size: 6804393 Basic stats: COMPLETE Column stats: NONE -- 表的统计信息
Select Operator -- 选择字段
expressions: user_id (type: string), item_id (type: string)
outputColumnNames: user_id, item_id
Statistics: Num rows: 34021 Data size: 6804393 Bas

本文深入分析了Hive中的Group by执行原理,包括MapReduce流程、Map端聚合以及数据倾斜处理。通过实例展示了开启Map端聚合如何减少数据传输,以及启用数据倾斜处理参数`hive.groupby.skewindata`如何通过两个job来均衡负载,缓解数据倾斜问题。同时,文章提到了开启该参数后无法进行多字段去重统计的限制。
最低0.47元/天 解锁文章
1114

被折叠的 条评论
为什么被折叠?



