Hive 中的四种排序 ---- 举例

版权声明:个人原创,转载请标注! https://blog.csdn.net/Z_Date/article/details/83987111

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;

猜你喜欢

转载自blog.csdn.net/Z_Date/article/details/83987111