天天看點

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

    hive中的order by跟傳統的sql語言中的order

by作用是一樣的,會對查詢的結果做一次全局排序,是以說,隻有hive的sql中制定了order

by所有的資料都會到同一個reducer進行處理(不管有多少map,也不管檔案有多少的block隻會啟動一個reducer)。但是對于大量資料這

将會消耗很長的時間去執行。

這裡跟傳統的sql還有一點差別:如果指定了hive.mapred.mode=strict(預設值是nonstrict),這時就必須指定limit

來限制輸出條數,原因是:所有的資料都會在同一個reducer端進行,資料量大的情況下可能不能出結果,那麼在這樣的嚴格模式下,必須指定輸出的條數。

    hive中指定了sort

by,那麼在每個reducer端都會做排序,也就是說保證了局部有序(每個reducer出來的資料是有序的,但是不能保證所有的資料是有序的,除非隻有一個reducer),好處是:執行了局部排序之後可以為接下去的全局排序提高不少的效率(其實就是做一次歸并排序就可以做到全局排序了)。

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

store:

mid

money

name

aa

15.0

商店1

20.0

商店2

bb

22.0

商店3

cc

44.0

商店4

    執行hive語句:

們所有的mid相同的資料會被送到同一個reducer去處理,這就是因為指定了distribute by

mid,這樣的話就可以統計出每個商戶中各個商店盈利的排序了(這個肯定是全局有序的,因為相同的商戶會放到同一個reducer去處理)。這裡需要注意

的是distribute by必須要寫在sort by之前。

    cluster by的功能就是distribute by和sort by相結合,如下2個語句是等價的:

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

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