hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by

Hive中的order by跟傳統(tǒng)的sql語(yǔ)言中的order by作用是一樣的,會(huì)對(duì)查詢的結(jié)果做一次全局排序,所以說(shuō),只有hive的sql中制定了order by所有的數(shù)據(jù)都會(huì)到同一個(gè)reducer進(jìn)行處理(不管有多少map,也不管文件有多少的block只會(huì)啟動(dòng)一個(gè)reducer)。但是對(duì)于大量數(shù)據(jù)這將會(huì)消耗很長(zhǎng)的時(shí)間去執(zhí)行。
這里跟傳統(tǒng)的sql還有一點(diǎn)區(qū)別:如果指定了hive.mapred.mode=strict(默認(rèn)值是nonstrict),這時(shí)就必須指定limit來(lái)限制輸出條數(shù),原因是:所有的數(shù)據(jù)都會(huì)在同一個(gè)reducer端進(jìn)行,數(shù)據(jù)量大的情況下可能不能出結(jié)果,那么在這樣的嚴(yán)格模式下,必須指定輸出的條數(shù)。

2. sort by

Hive中指定了sort by,那么在每個(gè)reducer端都會(huì)做排序,也就是說(shuō)保證了局部有序(每個(gè)reducer出來(lái)的數(shù)據(jù)是有序的,但是不能保證所有的數(shù)據(jù)是有序的,除非只有一個(gè)reducer),好處是:執(zhí)行了局部排序之后可以為接下去的全局排序提高不少的效率(其實(shí)就是做一次歸并排序就可以做到全局排序了)。

3. distribute by和sort by一起使用

ditribute by是控制map的輸出在reducer是如何劃分的,舉個(gè)例子,我們有一張表,mid是指這個(gè)store所屬的商戶,money是這個(gè)商戶的盈利,name是這個(gè)store的名字

mid money name
AA 15.0 商店1
AA 20.0 商店2
BB 22.0 商店3
CC 44.0 商店4

執(zhí)行hive語(yǔ)句:

select mid, money, name from store distribute by mid sort by mid asc, money asc  

我們所有的mid相同的數(shù)據(jù)會(huì)被送到同一個(gè)reducer去處理,這就是因?yàn)橹付薲istribute by mid,這樣的話就可以統(tǒng)計(jì)出每個(gè)商戶中各個(gè)商店盈利的排序了(這個(gè)肯定是全局有序的,因?yàn)橄嗤纳虘魰?huì)放到同一個(gè)reducer去處理)。這里需要注意的是distribute by必須要寫(xiě)在sort by之前。

4. cluster by

cluster by的功能就是distribute by和sort by相結(jié)合,如下2個(gè)語(yǔ)句是等價(jià)的:
select mid, money, name from store cluster by mid 
select mid, money, name from store distribute by mid sort by mid  

如果需要獲得與3中語(yǔ)句一樣的效果:

select mid, money, name from store cluster by mid sort by money  

注意被cluster by指定的列只能是降序,不能指定asc和desc。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容