(1)、参数调整
set hive.map.aggr=true (开启map端combiner); //在Map端做combiner,假如map各条数据基本上不一样, 聚合没什么意义,做combiner反而画蛇添足,hive里也考虑的比较周到通过参数
hive.groupby.mapaggr.checkinterval = 100000 (默认)
hive.map.aggr.hash.min.reduction=0.5(默认)
两个参数的意思是:预先取100000条数据聚合,如果聚合后的条数/100000>0.5,则不再聚合
set hive.groupby.skewindata=true;// 决定 group by 操作是否支持倾斜的数据。注意:只能对单个字段聚合. 控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题
如:
set hive.groupby.skewindata=true;
select key
, count(1) as cnt
from tb_name
group by key;
(2)、写法调整
select key
, count(1) as cnt
from tb_name
group by key;
-- 改进后写法
select a.key
, sum(cnt) as cnt
from (select key
, if(key = 'key001',random(),0)
, count(1) as cnt
from tb_name
group by key,
if(key = 'key001',random(),0)
) t
group by t.key;