hive中的全排序

2021-07-05 12:55:10 字數 1851 閱讀 2527

寫mapreduce程式時,如果reduce個數》1,想要實現全排序需要控制好map的輸出,詳見

hadoop簡單實現全排序

現在學了hive,寫sql大家都很熟悉,如果乙個order by解決了全排序還用那麼麻煩寫mapreduce函式嗎?

事實上,hive使用order by會預設設定reduce的個數=1,既然reducer的個數都是1了,結果自然全排序!

這也違背了充分利用分布式計算進行海量資料排序的初衷,效率低下。

那麼hive又提供了乙個可供選擇的方式:sort by

它會保證每個reducer的輸出檔案是有序的(其實是廢話,每個reducer的輸出當然是有序的!),要想實現全排序,還得加乙個order by的過程,就是對sort by的reduce輸出結果再進行一次排序。

所以:要想用hive實現全排序:

要麼用order by,但這樣預設了reducer個數為1,效率低下。

要麼用sort by+order by,sort by過程可以設定reducer個數(n),order by過程用n個reducer的輸出檔案進行一次全排序,得到最終的結果。

(個人理解,如有錯誤請不吝賜教,感謝!) 注:

(1)對於order by,sort by:

我們可以使用limit進行限制返回的行數,從而實現抓出資料的top n的情形。

(2)對於distribute by:

sort by為每個reducer產生乙個排序檔案。在有些情況下,你需要控制某個特定行應該到哪個reducer,通常是為了進行後續的聚集操作。hive的distribute by就派上用場了:

[sql]view plain

copy

print

?"font-size:18px;"

>

from

table

select

year

, temperature    

distribute by

year

sort by

year

asc, temperature 

desc; 

上面實現了區域性排序,且規定了:根據年份和氣溫對氣象資料進行排序,以確保所有具有相同年份的行最終都在乙個reducer分割槽中(檔案下),可以看出,distribute by經常與sort by一起使用。

需要注意的是,hive要求distribute by 要寫在sort by之前。

(3)對於cluster by:

簡而言之:cluster by column=distribute by column+sort by column  (注意,都是針對column列,且採用預設asc)

即對於上面例子:

[sql]view plain

copy

print

?"font-size:18px;"

>

from

table

select

year

, temperature    

cluster by

year;

就等於:

[sql]view plain

copy

print

?"font-size:18px;"

>

from

table

select

year

, temperature    

distribute by

year

sort by

year; 

當然這失去了按照氣溫排序的要求。

Hive中的排序語法

hive中的order by語句和關聯式資料庫中的sql語法相似。他會對查詢結果做全域性排序,這意味著所有的資料會傳送到乙個reduce任務上,這樣會導致在大數量的情況下,花費大量時間。與資料庫中 order by 的區別在於在hive.mapred.mode strict模式下,必須指定 limi...

hive中的排序和分組

order by order by 會對輸入坐全域性排序,因此 只有乙個reducer 多個reducer會無法保證全域性有序 只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間.set hive.mapred.mode nonstrict default value 預設值 set...

hive查詢中的排序總結

四個排序總結 order by 全域性排序 reduce啟動個數為乙個 sort by 區內排序和distrbute by 結合使用 reduce個數為多個 distribute by 同上reduce個數為多個 cluster by 當distribute by 和 sort by相同時 使用。r...