hive中幾個排序方式的區別


hive中Sort By,Order By,Cluster By,Distribute By,Group By的區別

order by:

   hive中的order by 和傳統sql中的order by 一樣,對數據做全局排序,加上排序,會新啟動一個job進行排序,會把所有數據放到同一個reduce中進行處理,不管數據多少,不管文件多少,都啟用一個reduce進行處理。如果指定了hive.mapred.mode=strict(默認值是nonstrict),這時就必須指定limit來限制輸出條數,原因是:所有的數據都會在同一個reducer端進行,數據量大的情況下可能不能出結果,那么在這樣的嚴格模式下,必須指定輸出的條數。

sort by:

  sort  by 是局部排序,會在每個reduce端做排序,每個reduce端是排序的,也就是每個reduce出來的數據是有序的,但是全部不一定有序,除非一個reduce,一般情況下可以先進行局部排序完成后,再進行全局排序,會提高不少效率。

distribute by:

  distribute by 是控制map端在reduce上是如何區分的,distribute by  會把指定的值發到同一個reduce中,比如 用上面數據distribute by id 它就會把id相同的值放到一個reduce中執行,不是一個值一個reduce,而是相同的值進入到一個reduce,例如用上面數據可以進入到2個reduce,一般情況下可以sort by 結合使用,先進行分組reduce,再進行排序(相當於mapreduce中的分區函數)。
PS:

Order by 能夠預期產生完全排序的結果,但是它是通過只用一個reduce來做到這點的。所以對於大規模的數據集它的效率非常低。在很多情況下,並不需要全局排序,此時可以換成Hive的非標准擴展sort by。Sort by為每個reducer產生一個排序文件。在有些情況下,你需要控制某個特定行應該到哪個reducer,通常是為了進行后續的聚集操作。Hive的distribute by 子句可以做這件事

cluster by(只能是使用默認的升序排序,不能使用ACS和DESC):

  這個其實就是distribute by 和sort by 結合使用的結果(前提是同一個字段)。
  例如:select id,money,name from t cluster by id;

  等價於:select id,money,name from t distribute by id sort by id

 

distribute by和group by的區別:

  都是按key值划分數據 都使用reduce操作 **唯一不同的是,distribute by只是單純的分散數據,distribute by col – 按照col列把數據分散到不同的reduce。而group by把相同key的數據聚集到一起,后續必須是聚合操作。

order by和sort by的區別:

  order by是全局排序 sort by只是確保每個reduce上面輸出的數據有序。如果只有一個reduce時,和order by作用一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM