場景
有木有發現工作中偶爾有些大量的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中。這兩種思想是解決此類問題的核心思想