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。