hive中order by,sort by, distribute by, cluster by作用以及用法
原文:hive中order by,sort by, distribute by, cluster by作用以及用法
1. order by
Hive中的order by跟傳統(tǒng)的sql語言中的order by作用是一樣的咆霜,會對查詢的結果做一次全局排序邓馒,所以說,只有hive的sql中制定了order by所有的數(shù)據(jù)都會到同一個reducer進行處理(不管有多少map蛾坯,也不管文件有多少的block只會啟動一個reducer)光酣。但是對于大量數(shù)據(jù)這將會消耗很長的時間去執(zhí)行。
這里跟傳統(tǒng)的sql還有一點區(qū)別:如果指定了hive.mapred.mode=strict(默認值是nonstrict),這時就必須指定limit來限制輸出條數(shù)脉课,原因是:所有的數(shù)據(jù)都會在同一個reducer端進行救军,數(shù)據(jù)量大的情況下可能不能出結果,那么在這樣的嚴格模式下倘零,必須指定輸出的條數(shù)唱遭。
2. sort by
Hive中指定了sort by,那么在每個reducer端都會做排序呈驶,也就是說保證了局部有序(每個reducer出來的數(shù)據(jù)是有序的拷泽,但是不能保證所有的數(shù)據(jù)是有序的,除非只有一個reducer)袖瞻,好處是:執(zhí)行了局部排序之后可以為接下去的全局排序提高不少的效率(其實就是做一次歸并排序就可以做到全局排序了)司致。
3. distribute by和sort by一起使用
ditribute by是控制map的輸出在reducer是如何劃分的,舉個例子聋迎,我們有一張表蚌吸,mid是指這個store所屬的商戶,money是這個商戶的盈利砌庄,name是這個store的名字:
mid | money | name |
---|---|---|
AA | 15.0 | 商店1 |
AA | 20.0 | 商店2 |
BB | 22.0 | 商店3 |
CC | 44.0 | 商店4 |
執(zhí)行hive語句:
select mid, money, name from store distribute by mid sort by mid asc, money asc
我們所有的mid相同的數(shù)據(jù)會被送到同一個reducer去處理,這就是因為指定了distribute by mid奕枢,這樣的話就可以統(tǒng)計出每個商戶中各個商店盈利的排序了(這個肯定是全局有序的娄昆,因為相同的商戶會放到同一個reducer去處理)。這里需要注意的是distribute by必須要寫在sort by之前缝彬。
4. cluster by
cluster by的功能就是distribute by和sort by相結合萌焰,如下2個語句是等價的:
select mid, money, name from store cluster by mid
select mid, money, name from store distribute by mid sort by mid
如果需要獲得與3中語句一樣的效果:
select mid, money, name from store cluster by mid sort by money
注意被cluster by指定的列只能是降序,不能指定asc和desc谷浅。