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中的排序語法