4种排序方式比较:order by, sort by, distribute by, cluster by

文章记录了4种排序方式:order by, sort by, distribute by, cluster by

总结:

  1. order by 全局排序,只有一个 Reducer,通过order对字段进行降序或者升序

  2. sort by 对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。Sort by 为每个reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。

  3. distribute by 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition (自定义分区),进行分区,结合 sort by 使用。对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。

  4. cluster by cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序 排序,不能指定排序规则为 ASC 或者 DESC。

注意:
➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后, 余数相同的分到一个区。
➢ Hive要求DISTRIBUTEBY语句要写在SORTBY语句之前。

细节补充+案例:

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,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;

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值