Hive的sort by, order by, distribute by, cluster by區別?

  Hive的order by語句和其餘的SQL語言的定義是同樣的,其會對查詢結果集執行一個全局排序。這也就是說會有一個全部的數據都經過一個reducer進行處理的過程。對於大數據集,這個過程可能會消耗太過漫長的時間來執行。大數據

  Hive增長了一個可供選擇的方式,也就是sort by,其只會在每一個reducer中對數據進行排序,也就是執行一個局部排序的過程。這能夠保證每一個reducer的輸出數據都是有序的(但並不是全局有序)。這樣就能夠提升後面進行的全局排序的效率。
  使用sort by,你能夠指定執行的reduce個數(set mapred.reduce.tasks=<number>),對輸出的數據再執行歸併排序,便可以獲得所有結果。排序

  要想使用Hive實現全排序:
  1.使用order by,但這樣默認了reducer個數爲1,效率低下。
  2.使用sort by + order by。sort by會保證每一個reducer的輸出文件是有序的(實際上是廢話,每一個reducer的輸出固然是有序的!),要想實現全排序,還得加一個order by的過程,就是對sort by的reduce輸出結果再進行一次排序。sort by爲每一個reducer產生一個排序文件。在有些狀況下,你須要控制某個特定行應該到哪一個reducer,一般是爲了進行後續的彙集操做。hive的distribute by 就派上用場了:
                               From table
                               select year,temperature
                               distribute by year
                               sort by year asc,temperatue desc;table

  上面實現了局部排序,且規定了:根據年份和睦溫對氣象數據進行排序,以確保全部具備相同年份的行最終都在一個reducer分區中(文件下),能夠看出,distribute by常常與 sort by一塊兒使用。。
  須要注意的是,hive要求distribute by要寫在sort by以前。效率

  cluster by:cluster by column = distribute by column + sort by columnselect

相關文章
相關標籤/搜索