1. 程式人生 > >hive count distinct

hive count distinct

select count(distinct user_id) from dm_user where ds=20150701;

使用disticnt函式,所有的資料只會shuffle到一個reducer上,導致reducer資料傾斜嚴重

優化後為

set mapred.reduce.tasks=50;

select count(*) from

(select user_id from dm_user where ds=20150701 group by user_id)t;

order by全域性排序,只有一個reduce

sort by 在一個reduce中排序,distribute by 按欄位分為不同的reduce    

distribute by 先分為不同的reduce排序,之後在reduce內部排序

// 一個reduce(海量資料,速度很慢) select year, temperature order by year asc, temperature desc limit 100;  

替換成

// 多個reduce(海量資料,速度很快) select year, temperature  distribute by year  sort by year asc, temperature desc limit 100; order by  (全域性排序 )
order by 會對輸入做全域性排序,因此只有一個reducer(多個reducer無法保證全域性有序)
只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。  
在hive.mapred.mode=strict模式下,強制必須新增limit限制,這麼做的目的是減少reducer資料規模
例如,當限制limit 100時, 如果map的個數為50, 則reducer的輸入規模為100*50  
distribute by  (類似於分桶)
根據distribute by指定的欄位對資料進行劃分到不同的輸出reduce 檔案中
sort by   (類似於桶內排序)
sort by不是全域性排序,其在資料進入reducer前完成排序。
因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1, 則sort by只保證每個reducer的輸出有序,不保證全域性有序。  
cluster by
cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。 
但是排序只能是倒序排序,不能指定排序規則為asc 或者desc。  
因此,常常認為cluster by = distribute by + sort by