Hadoop Hive 中幾種排序方法的區別與比較

Hive 中 Order by, Sort by ,Dristribute by,Cluster By 的做用和用法 java

1. order by 數據庫

set hive.mapred.mode=nonstrict; (default value / 默認值) 服務器

set hive.mapred.mode=strict; 函數

 order by 和數據庫中的Order by 功能一致,按照某一項 & 幾項 排序輸出。 oop

 與數據庫中 order by 的區別在於在hive.mapred.mode = strict 模式下 必須指定 limit 不然執行會報錯。 spa

 hive> select * from test order by id;      blog

FAILED: Error in semantic analysis: 1:28 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id' 排序

 緣由: 在order by 狀態下全部數據會到一臺服務器進行reduce操做也即只有一個reduce,若是在數據量大的狀況下會出現沒法輸出結果的狀況,若是進行 limit n ,那只有  n * map number 條記錄而已。只有一個reduce也能夠處理過來。 token

 

2. sort by hadoop

sort by 不受 hive.mapred.mode 是否爲strict ,nostrict 的影響

 sort by 的數據只能保證在同一reduce中的數據能夠按指定字段排序。

 使用sort by 你能夠指定執行的reduce 個數 (set mapred.reduce.tasks=<number>) 這樣能夠輸出更多的數據。

對輸出的數據再執行歸併排序,便可以獲得所有結果。

注意:能夠用limit子句大大減小數據量。使用limit n後,傳輸到reduce端(單機)的數據記錄數就減小到n* (map個數)。不然因爲數據過大可能出不告終果。

 http://www.alidata.org/archives/622


3. distribute by

 按照指定的字段對數據進行劃分到不一樣的輸出reduce  / 文件中。

 insert overwrite local directory '/home/hadoop/out' select * from test order by name distribute by length(name);  

 此方法會根據name的長度劃分到不一樣的reduce中,最終輸出到不一樣的文件中。 

 length 是內建函數,也能夠指定其餘的函數或這使用自定義函數。

4. DISTRIBUTE BY with SORT BY
DISTRIBUTE BY可以控制map的輸出在reduce中如何劃分。其能夠按照指定的字段對數據進行劃分到不一樣的輸出reduce/文件中。
DISTRIBUTE BY和GROUP BY有點相似,DISTRIBUTE BY控制reduce如何處理數據,而SORT BY控制reduce中的數據如何排序。
注意:hive要求DISTRIBUTE BY語句出如今SORT BY語句以前。 

5. Cluster By

 cluster by 除了具備 distribute by 的功能外還兼具 sort by 的功能。 

 默認倒序排序,但DISTRIBUTE BY的字段和SORT BY的字段必須相同,且不能指定排序規則。 asc  或者 desc。

總結:

ORDER BY是全局排序,但在數據量大的狀況下,花費時間會很長
SORT BY是將reduce的單個輸出進行排序,不能保證全局有序
DISTRIBUTE BY能夠按指定字段將數據劃分到不一樣的reduce中
當DISTRIBUTE BY的字段和SORT BY的字段相同時,能夠用CLUSTER BY來代替 DISTRIBUTE BY with SORT BY。

Refer:

Hive中的排序語法

http://blog.javachen.com/2014/06/22/sort-in-hive-query/#

相關文章
相關標籤/搜索