【Hive】数据倾斜优化 shuffle, join, group by

总结一下数据倾斜的优化。

首先从导致数据倾斜的原因方面分析入手,主要是group by和join的相关操作,这两个操作都会把相同的key拉到同一个reduce,如果其中某些key分布不均数量过大,这就会导致数据倾斜了。

group by导致的数据倾斜优化:

select --最后汇总
    pkg
    ,sum(part_cnt) as installed_cnt
from 
    (  --先局部关联
    select 
        substr(pkg_new, 1, length(pkg_new) - 3) as pkg
        ,count(userid) as part_cnt
    from 
        (  --利用rand函数加后缀,散列化分发到不同的reduce中
            select 
                concat(pkg, '_', floor(10 + rand() * 89)) as pkg_new
                ,userid 
            from table1
            where day = '${day}'
        ) a
    group by 
        pkg_new
        ,userid
    ) b
group by pkg

join连接导致的数据倾斜优化:

select
  t1.pkg
  ,cnt1
  ,cnt2
from
(
    select pkg, cnt1, cnt2
    --用rand函数散列,分发到不同的reduce中
    ,cast(floor(rand()*10) as string) as rand_num   
    from table1
) t1
join  
    --维表膨胀10倍,这样可以和前表散列后关联得上
    (
      select pkg, pkg_cn, rand_num
      from table2
      lateral view explode(split('0,1,2,3,4,5,6,7,8,9',',')) num as rand_num
    ) t2
    on t1.rand_num = t2.rand_num and t1.pkg= t2.pkg

谢谢大家的阅读,也欢迎朋友们提出更好的优化方案~

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页