hive中order by,sort by, distribute by, cluster by的用法


1、order by 

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

  如:原始數據為

 id money name  

2 15 d

2 13 b

4 13 g

1 14 c

1 12 a

3 11 h

3 14 f

select id,sum(money) from t group by id 這條語句只用一個job就ok,

select id,sum(money) from t group by id order by id 如果加上order by 就會多一個job進行排序操作。

2、sort by 

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

select id,sum(money) from t group by id sort by id;  這條語句也不會增加job,它在reduce端直接進行排序。

3、distribute by

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

如:select id,money,name from t distribute by id sort by id 

4、cluster  by

    這個其實就是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  這條語句的結果是一樣的


免責聲明!

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



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