關於 Hive 空值過多引起的數據傾斜的兩種解決方案


場景

有木有發現工作中偶爾有些大量的null值或者一些無意義的數據參與到計算作業中,任務跑的賊慢,表中有大量的null值,如果表之間進行join關聯操作,就會有shuffle產生,這樣所有的null值都會集中在一個reduce中,會產生數據傾斜,降低作業效率。辣么我們該如何避免這種囧況呢,現在給大家嘮嘮

方案一、避免 null 值參與關聯 

手動過濾null 值不進行 join,,值將非 null 值得數據進行關聯,這樣就避免了null 值參與運算;
select a.log_info, b.user_name
from temp.jc_shop_info a
         left join temp.jc_f_user_info b
                   on a.user_id is not null
                       and a.user_id = b.user_id
union all
select log_info, null user_name
from temp.jc_shop_info
where user_id is null;

方案二 隨機賦值

因為null值參join 也無法關聯到數據,那么我們可以給null值隨機賦值,這樣它們的hash結果就不一樣,隨機數均勻的進到不同的reduce中從而避免數據傾斜:
select a.log_info, b.user_name
from (select *, if(user_id is null, concat('user__-', rand())) user_id_new from temp.jc_shop_info) a
         left join temp.jc_f_user_info b
                   on user_id_new = b.user_id; 

小結

今天介紹了在hivesql中如何解決null值引發的數據傾斜問題,其核心思路兩個,一是null值單獨過濾出不參與匹配,非null值的進行join匹配;二是隨機思想,將容易傾斜的key隨機打散分到不同的redcue中而不是同一個reduce中。這兩種思想是解決此類問題的核心思想

 

 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM