說明Hive中order by,sort by,distribute by,cluster by的作用

小財迷,嘻嘻發表於2020-12-01

籠統地看,這四個在hive中都有排序和聚集的作用,然而,它們在執行時所啟動的MR卻各不相同。

1、order by

order by會對所給的全部資料進行全域性排序,並且只會“叫醒”一個reducer幹活。它就像一個糊塗蛋一樣,不管來多少資料,都只啟動一個reducer來處理。因此,資料量小還可以,但資料量一旦變大order by就會變得異常吃力,甚至“罷工”。

  • order by(ASC | DESC):類似mysql
  • 只使用一個Reducer執行全域性資料排序
  • 速度慢,應提前做好資料過濾
  • 支援使用CASE WHEN或表示式
  • 支援按位置編號排序,需要設定:set hive.groupby.orderby.position.alias=true
select * from offers order by case when offerid = 1 then 1 else 0 end;
select * from offers order by 1;

2、sort by

sort by是區域性排序。相比order by的懶惰糊塗,sort by正好相反,它不但非常勤快,而且具備分身功能。sort by會根據資料量的大小啟動一到多個reducer來幹活,並且,它會在進入reduce之前為每個reducer都產生一個排序檔案。這樣的好處是提高了全域性排序的效率。

  • SORT BY對每個Reducer中的資料進行排序
  • 當Reducer數量設定為1時,等於ORDER BY
  • 排序列必須出現在SELECT column列表中

3、distribute by

distribute by的功能是:distribute by 控制map結果的分發,它會將具有相同欄位的map輸出分發到一個reduce節點上做處理。即就是,某種情況下,我們需要控制某個特定行到某個reducer中,這種操作一般是為後續可能發生的聚集操作做準備。這樣肯定是全域性有序的,因為相同的欄位會被放到同一個reducer處理,distribute by需要和sort by一起使用,distribute by必須要寫在sort by之前。

  • distribute by :類似mysql的group by
  • 確保具有匹配列值的行被分割槽到相同的Reducer
  • 不會對每個Reducer的輸出進行排序
  • 通常使用在SORT BY語句之前
select id,name,score from stu_score
distribute by id
sort by score desc;

4、cluster by

如果sort by和distribute by中所用的列相同,可以縮寫為cluster by以便同時指定兩者所用的列。

  • cluster by :除了具有distribute by 的功能外,還會對該欄位進行排序。
  • CLUSTER BY = DISTRIBUTE BY + SORT BY
  • 不支援ASC|DESC
  • 排序列必須出現在SELECT column列表中
  • 為了充分利用所有的Reducer來執行全域性排序,可以先使用CLUSTER BY,然後使用ORDER BY

相關文章