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作用一樣。
hive的幾個排序
hive中常用的幾個排序 order by 全域性排序,因為是全域性排序,所以job是乙個reduce,reduce的個數引數設定對其無效 sort by 乙個reduce時為全域性排序,多個reduce時,每個reduce各自排序,為了提高全域性排序的效能,可以先用sort by做區域性排序,然後...
Hive的幾種排序方式
記錄hive的幾種常見的排序方式 order by 普通排序,通過order對欄位進行降序或者公升序 select from emp order by sal sort by 對每乙個reduce的結果進行排序,為了看出效果,我們多設定幾個reduce,檢視每個reduce的結果是否是排序的。set...
hive的排序方式的比較
order by 全排序 所有的任務分配在乙個reduce上面,將會花費大量的時間,可以保證全域性有序 同時還需要設定下面兩個引數 hive set sethive.strict.checks.large.query false 大規模查詢的檢查為false hive set hive.mapred...