注:group by 優於distinct group
情形:group by 維度過小,某值的數量過多
後果:處理某值的reduce非常耗時
解決方式:採用sum() group by的方式來替換count(distinct)完成計算。
2)count(distinct)
count(distinct xx)
情形:某特殊值過多
後果:處理此特殊值的reduce耗時;只有乙個reduce任務
解決方式:count distinct時,將值為空的情況單獨處理,比如可以直接過濾空值的行,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行union。
3)mapjoin
4)不同資料型別關聯產生資料傾斜
情形:比如使用者表中user_id欄位為int,log表中user_id欄位既有string型別也有int型別。當按照user_id進行兩個表的join操作時。
後果:處理此特殊值的reduce耗時;只有乙個reduce任務
預設的hash操作會按int型的id來進行分配,這樣會導致所有string型別id的記錄都分配到乙個reducer中。
解決方式:把數字型別轉換成字串型別
select * from users a
left outer join logs b
on a.usr_id = cast(b.user_id as string)
5)開啟資料傾斜時負載均衡
set hive.groupby.skewindata=true;
思想:就是先隨機分發並處理,再按照key group by來分發處理。
操作:當選項設定為true,生成的查詢計畫會有兩個mrjob。
第乙個mrjob 中,map的輸出結果集合會隨機分布到reduce中,每個reduce做部分聚合操作,並輸出結果,這樣處理的結果是相同的groupby key有可能被分發到不同的reduce中,從而達到負載均衡的目的;
第二個mrjob再根據預處理的資料結果按照groupby key分布到reduce中(這個過程可以保證相同的原始groupby key被分布到同乙個reduce中),最後完成最終的聚合操作。
點評:它使計算變成了兩個mapreduce,先在第乙個中在 shuffle 過程 partition 時隨機給 key 打標記,使每個key 隨機均勻分布到各個 reduce 上計算,但是這樣只能完成部分計算,因為相同key沒有分配到相同reduce上。
所以需要第二次的mapreduce,這次就回歸正常 shuffle,但是資料分布不均勻的問題在第一次mapreduce已經有了很大的改善,因此基本解決資料傾斜。因為大量計算已經在第一次mr中隨機分布到各個節點完成。
6)控制空值分布
將為空的key轉變為字串加隨機數或純隨機數,將因空值而造成傾斜的資料分不到多個reducer。
注:對於異常值如果不需要的話,最好是提前在where條件裡過濾掉,這樣可以使計算量大大減少
實踐中,可以使用case when對空值賦上隨機值。此方法比直接寫is not null更好,因為前者job數為1,後者為2.
使用case when例項1:
select userid, name from user_info a
join
(select
case when userid is null then cast (rand(
47)* 100000 as int )
else userid end from user_read_log
) b on a.userid = b.userid
使用case when例項2:
select
'$' as thedate,
a.search_type,
a.query,
a.category,
a.cat_name,
a.brand_id,
a.brand_name,
a.dir_type,
a.rewcatid,
a.new_cat_name,
a.new_brand_id,
f.brand_name as new_brand_name,
a.pv,
a.uv,
a.ipv,
a.ipvuv,
a.trans_amt,
a.trans_num,
a.alipay_uv
from fdi_search_query_cat_qp_temp a
left outer join brand f
on f.pt=
'$000000' and case when a.new_brand_id is null then concat(
'hive',rand())
else a.new_brand_id end = f.brand_id;
如果上述的方法還不能解決,比如當有多個join的時候,建議建立臨時表,然後拆分hive sql語句。 Hive資料傾斜解決
什麼是資料傾斜?簡單來說資料傾斜就是資料的key的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。資料傾斜產生的原因是什麼?舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進 行 value 相加,得出 aaa 出現的次數。若進行...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...