Hive 中常见的order by distribute by等区别详解

1 Order By

hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行处理。

如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

2 Sort By

sort by 是局部排序,会在每个reduce端做排序,每个reduce端是排序的,也就是每个reduce出来的数据是有序的,但是全部不一定有序,除非一个reduce,一般情况下可以先进行局部排序完成后,再进行全局排序,会提高不少效率。

3 Distribute By

distribute by 是控制map端在reduce上是如何区分的,distribute by会把相同的Key发到同一个reduce中。一般情况下可以结合sort by 使用,distribute by必须要写在sort by之前。先进行分组reduce,再进行排序(相当于mapreduce中的分区函数)。

比如:

select mid, money, name from store distribute by mid sort by mid asc, money asc

所有mid相同的数据会被送到同一个reducer去处理,这是因为指定了distribute by mid。
  
PS:

Order by 能够预期产生完全排序的结果,但是它是通过只用一个reduce来做到这点的。所以对于大规模的数据集它的效率非常低。在很多情况下,并不需要全局排序,此时可以换成Hive的非标准扩展sort by。Sort by为每个reducer产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。Hive的distribute by 子句可以做这件事。

4 Cluster By

只能是使用默认的升序排序,不能使用ASC和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作用一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值