hive group by倾斜优化

(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;

你可能感兴趣的:(hive)