基础数据
我们使用电商网站用户行为数据进行测试,数据格式如下:
-- 用户行为数据
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