hive排序總結

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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容