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

1. order by

    Hive中的order by跟傳統的sql語言中的order by做用是同樣的,會對查詢的結果作一次全局排序,因此說,只有hive的sql中制定了order by全部的數據都會到同一個reducer進行處理(無論有多少map,也無論文件有多少的block只會啓動一個reducer)。可是對於大量數據這將會消耗很長的時間去執行。sql

    這裏跟傳統的sql還有一點區別:若是指定了hive.mapred.mode=strict(默認值是nonstrict),這時就必須指定limit來限制輸出條數,緣由是:全部的數據都會在同一個reducer端進行,數據量大的狀況下可能不能出結果,那麼在這樣的嚴格模式下,必須指定輸出的條數。spa

2. sort by

    Hive中指定了sort by,那麼在每一個reducer端都會作排序,也就是說保證了局部有序(每一個reducer出來的數據是有序的,可是不能保證全部的數據是有序的,除非只有一個reducer),好處是:執行了局部排序以後能夠爲接下去的全局排序提升很多的效率(其實就是作一次歸併排序就能夠作到全局排序了)。code

3. distribute by和sort by一塊兒使用

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

store:ci

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

    執行hive語句:it

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

咱們全部的mid相同的數據會被送到同一個reducer去處理,這就是由於指定了distribute by mid,這樣的話就能夠統計出每一個商戶中各個商店盈利的排序了(這個確定是全局有序的,由於相同的商戶會放到同一個reducer去處理)。這裏須要注意的是distribute by必需要寫在sort by以前。table

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

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

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

相關文章
相關標籤/搜索