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