HIVE 排序總結
ORDER BY
Hive中的order by語句用于對查詢結果集執行一個全局排序。這也就是說會有一個所有的數據都通過特格reducer進行處理的過程。對于大數據集,這個過程可能消耗太過漫長的時間來執行。
使用語法
select * from table order by id desc limit 5;
在嚴格模式下必須使用limit限定條件,因為如果數據量特別大的話會出現無法輸出結果的情況,如果驚醒limit n限定,那么只有 (n * map number)
條記錄進行處理。
設置hive MapReduce模式
set hive.mapred.mode = nonstrict; // 設置非嚴格模式,默認情況下就是非嚴格模式
set hive.mapred.mode = strict ; // 設置為嚴格模式
SORT BY
sort by不是全局排序,其只會在每個reduce中對數據進行排序,也就是執行一個局部排序過程。這可以保證每個reduce的輸出數據都是有序的(但并非全局有序)。這樣可以提高后面進行的全局排序的效率。
sort by不受hive.mapred.mode是否為strict的影響。
使用sort by你可以通過指定執行的reduce個數(set mapred.reduce.tasks=<number>)對輸出的數據再執行歸并排序,既可以得到全部結果。
使用語法
select s.ymd, s.ymbol, s.price from stocks s sort by s.ymd ASC, s.symbol DESC;
總結如果設置的reduce個數為1的話那么sort by 語句和order by語句輸出的結果就一樣。
DISTRIBUTE BY
DISTRIBUTE BY控制map的輸出在reducer中是如何劃分的。MapReduce job中傳輸的所有數據都是 按照key/value對的形式進行組織的,因此Hive在將用戶的查詢語句轉換成MapReduce job時,其必須在內部使用這個功能。
默認情況下,MapRecude計算框架會依據map輸入的鍵計算相應的哈希值,然后按照得到的hash值將內容分發到多個reduce中去,不過當使用sort by時,不同的reducer的輸出會有明顯的重疊,至少對于排列順序而言是這樣的,即使每個reducer的輸出的數據都是有序的。
加入我們希望具有相同的股票交易碼的數據在一起處理,那么我們可以使用DISTRIBUTE BY來保證具有相同股票交易碼的記錄會分發 到同一個reducer中進行處理,然后使用sort by來按照 我們的期望對數據進行排序。
使用方法
select s.ymd, s.ymbol, s.price from stocks s DISTRIBUTE BY s.ymbol sort by s.symbol ASC;
注意:Hive要求DISTRIBUTE BY 語句要寫在sort by語句之前。
CLUSTER BY
CLUSTER BY的功能就是DISTRIBUTE BY 和SORT BY相結合,如下語句等效:
select cid , price from orders DISTRIBUTE BY cid SORT BY cid ;
select cid , price from orders CLUSTER BY cid ;
注意:被cluster by指定列只能呢按照降序進行排列,不能指定asc和desc。