【Hive】資料傾斜優化 shuffle, join, group by

geekingLi發表於2020-09-24

總結一下資料傾斜的優化。

首先從導致資料傾斜的原因方面分析入手,主要是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}'
            and last = new 
        ) 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.package = t2.package

謝謝大家的閱讀,也歡迎朋友們提出更好的優化方案~

相關文章