1、order by 可以指定desc 降序 asc 公升序
order by會對輸入做全域性排序,因此只有乙個reducer(多個reducer無法保證全域性有序),然而只有乙個reducer,會導致當輸入規模較大時,消耗較長的計算時間。
create table temperature(
year int,
temper float
)row format delimited fields terminated by '\t';
temperature.year temperature.temper
2008 32.0
2008 21.0
2008 31.5
2008 17.0
2013 34.0
2015 32.0
2015 33.0
2015 15.9
2015 31.0
2015 19.9
2015 27.0
2016 23.0
2016 39.9
2016 32.0
2.sort by
sort by不是全域性排序,其在資料進入reducer前完成排序,因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1,則sort by只會保證每個reducer的輸出有序,並不保證全域性有序。sort by不同於order by,它不受hive.mapred.mode屬性的影響,sort by的資料只能保證在同乙個reduce中的資料可以按指定字段排序。使用sort by你可以指定執行的reduce個數(通過set mapred.reduce.tasks=n來指定),對輸出的資料再執行歸併排序,即可得到全部結果。
//設定reduce個數為3;
set mapred.reduce.tasks=3;
//查詢此次任務中reduce的個數;
set mapred.reduce.tasks;
insert overwrite local directory '/home/user01/sort' row format delimited fields terminated by '\t' select * from temperature sort by year;
[user01@hadoop sort]$ ls
000000_0 000001_0 000002_0
[user01@hadoop sort]$ cat 000000_0
2008 31.5
2008 21.0
2015 31.0
2015 32.0
2015 33.0
2016 23.0
[user01@hadoop sort]$ cat 000001_0
2008 17.0
2013 34.0
2015 19.9
2015 15.9
2016 39.9
2016 32.0
[user01@hadoop sort]$ cat 000002_0
2008 32.0
2015 27.0
3.distribute by (重要)
distribute by是控制在map端如何拆分資料給reduce端的。hive會根據distribute by後面列,對應reduce的個數進行分發,預設是採用hash演算法。sort by為每個reduce產生乙個排序檔案。在有些情況下,你需要控制某個特定行應該到哪個reducer,這通常是為了進行後續的聚集操作。distribute by剛好可以做這件事。因此,distribute by經常和sort by配合使用。
//根據年份和氣溫對氣象資料進行排序,以確保所有具有相同年份的行最終都在乙個reducer分割槽中
注:distribute by和sort by的使用場景
1.map輸出的檔案大小不均。
2.reduce輸出檔案大小不均。
3.小檔案過多。
4.檔案超大。
$ cat distribute/000000_0
2016,23.0
2016,39.9
2016,32.0
2013,34.0
$ cat distribute/000001_0
2008,32.0
2008,21.0
2008,31.5
2008,17.0
$ cat distribute/000002_0
2015,31.0
2015,19.9
2015,27.0
2015,32.0
2015,33.0
2015,15.9
☆二者結合使用
select * from temperature distribute by year sort by year asc, temper desc;
2013 34.0
2016 39.9
2016 32.0
2016 23.0
2008 32.0
2008 31.5
2008 21.0
2008 17.0
2015 33.0
2015 32.0
2015 31.0
2015 27.0
2015 19.9
2015 15.9
4.cluster by
cluster by除了具有distribute by的功能外還兼具sort by的功能。但是排序只能是倒敘排序,不能指定排序規則為asc或
者desc。
select * from cluster by year;
Hive 中的四種排序
1 order by 可以指定desc 降序 asc 公升序 order by會對輸入做全域性排序,因此只有乙個reducer 多個reducer無法保證全域性有序 然而只有乙個reducer,會導致當輸入規模較大時,消耗較長的計算時間。create table temperature year i...
hive中四種排序的區別
hive中有四種排序,分別是 order by,sort by,distribute by 重點 cluster by order by 全域性排序,但是只能有乙個reduce來處理,在嚴格模式下必須指定limit,否則會報錯,在資料量很大的時候,處理時間會很長甚至跑不出資料,慎用!sort by ...
Hive 四種排序方式
hive中4種排序的區別 共有四種排序 order by,sort by distribute by,cluster by order by 全域性排序 對輸入的資料做排序,故此只有乙個reducer 多個reducer無法保證全域性有序 只有乙個reducer,會導致當輸入規模較大時,需要較長的計...