hive中order by 、sort by、distribute by、cluster by区别

1.Order By:全局排序,只有一个Reducer,所以当数据量很大的时候用order by会比较慢。

2.sort by:区内排序,每个Reducer内部进行排序,对全局结果集来说不是排序。
(使用sort by的话前提要设置一下reduce个数,set mapreduce.job.reduces=n,n为reduce的个数,n>1)

例如按照部门编号从高到低进行排序,这里我的reduce设置的是3。

原表数据

在这里插入图片描述

sort by 之后
insert overwrite local directory ‘/demo/hive/sort-res’ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
select * from emp sort by deptno desc;
查看sort by之后的数据

在这里插入图片描述

这里我们可以看到因为我们没有指明按什么来分区,所以hive默认是随机先分区,然后在此分区内部在进行按相应的字段来排序,可以看到在每个分区的里面部门编号都是从高到低的(最后面的那一列是部门编号)。

3.分区排序(Distribute By)
Distribute By:类似MR中partition,进行分区,并且Distribute By一般情况下都是结合sort by使用,partition by结合order by使用。这两组先分区在排序的效果是一样的,注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
举例:还是刚才的原表,先按照部门编号分区,再按照员工工资降序排序。也即是hive这次按照我们的Distribute By先把区分好,然后在区内进行一个排序。

insert overwrite local directory ‘/demo/hive/sort-res1’ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
select * from emp distribute by deptno sort by sal desc;
可以看到在按照部门编号分区以后又在区内进行工资的降序排序,\N为null。

在这里插入图片描述

4.Cluster By:当distribute by和sorts by字段相同时,可以使用cluster by方式。cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
以下两种等价的写法:
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;

总结:
*对于order by来说,就算你设置了reduce>1他依然是按照一个reduce来处理。
*对于sort by,reduce的个数一定要设置为多个,不然的话它还是会进行像order一样的全局排序,而且在使用sort by的时候基本上是和Distribute By一起用。
*对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值