hive count distinct
阿新 • • 發佈:2019-01-25
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