HIVE 排序總結(jié)
ORDER BY
Hive中的order by語句用于對(duì)查詢結(jié)果集執(zhí)行一個(gè)全局排序锦爵。這也就是說會(huì)有一個(gè)所有的數(shù)據(jù)都通過特格reducer進(jìn)行處理的過程狭莱。對(duì)于大數(shù)據(jù)集,這個(gè)過程可能消耗太過漫長(zhǎng)的時(shí)間來執(zhí)行皆愉。
使用語法
select * from table order by id desc limit 5;
在嚴(yán)格模式下必須使用limit限定條件嗜价,因?yàn)槿绻麛?shù)據(jù)量特別大的話會(huì)出現(xiàn)無法輸出結(jié)果的情況,如果驚醒limit n限定幕庐,那么只有 (n * map number)
條記錄進(jìn)行處理久锥。
設(shè)置hive MapReduce模式
set hive.mapred.mode = nonstrict; // 設(shè)置非嚴(yán)格模式,默認(rèn)情況下就是非嚴(yán)格模式
set hive.mapred.mode = strict ; // 設(shè)置為嚴(yán)格模式
SORT BY
sort by不是全局排序异剥,其只會(huì)在每個(gè)reduce中對(duì)數(shù)據(jù)進(jìn)行排序瑟由,也就是執(zhí)行一個(gè)局部排序過程。這可以保證每個(gè)reduce的輸出數(shù)據(jù)都是有序的(但并非全局有序)冤寿。這樣可以提高后面進(jìn)行的全局排序的效率歹苦。
sort by不受hive.mapred.mode是否為strict的影響绿鸣。
使用sort by你可以通過指定執(zhí)行的reduce個(gè)數(shù)(set mapred.reduce.tasks=<number>)對(duì)輸出的數(shù)據(jù)再執(zhí)行歸并排序,既可以得到全部結(jié)果暂氯。
使用語法
select s.ymd, s.ymbol, s.price from stocks s sort by s.ymd ASC, s.symbol DESC;
總結(jié)如果設(shè)置的reduce個(gè)數(shù)為1的話那么sort by 語句和order by語句輸出的結(jié)果就一樣潮模。
DISTRIBUTE BY
DISTRIBUTE BY控制map的輸出在reducer中是如何劃分的。MapReduce job中傳輸?shù)乃袛?shù)據(jù)都是 按照key/value對(duì)的形式進(jìn)行組織的痴施,因此Hive在將用戶的查詢語句轉(zhuǎn)換成MapReduce job時(shí)擎厢,其必須在內(nèi)部使用這個(gè)功能。
默認(rèn)情況下辣吃,MapRecude計(jì)算框架會(huì)依據(jù)map輸入的鍵計(jì)算相應(yīng)的哈希值动遭,然后按照得到的hash值將內(nèi)容分發(fā)到多個(gè)reduce中去,不過當(dāng)使用sort by時(shí)神得,不同的reducer的輸出會(huì)有明顯的重疊厘惦,至少對(duì)于排列順序而言是這樣的,即使每個(gè)reducer的輸出的數(shù)據(jù)都是有序的哩簿。
加入我們希望具有相同的股票交易碼的數(shù)據(jù)在一起處理宵蕉,那么我們可以使用DISTRIBUTE BY來保證具有相同股票交易碼的記錄會(huì)分發(fā) 到同一個(gè)reducer中進(jìn)行處理,然后使用sort by來按照 我們的期望對(duì)數(shù)據(jù)進(jìn)行排序节榜。
使用方法
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相結(jié)合,如下語句等效:
select cid , price from orders DISTRIBUTE BY cid SORT BY cid ;
select cid , price from orders CLUSTER BY cid ;
注意:被cluster by指定列只能呢按照降序進(jìn)行排列宗苍,不能指定asc和desc稼稿。