Hive: 解析order by、sort by、distributed by 、cluster by区别

207 views

Hive中,order by、sort by 、 distribute by 和cluster by分别代表三种不同的排序方法,虽然都是排序,但是它们的功能是不一样的。

简单来说,order by的功能和在SQL中的功能是一样的,对每一条数据根据特定属性进行排序。而sort by则是在reduce内部对每个数据根据特定属性进行排序。distribute by则有点类似于mapreduce的分区,对于同一个属性字段的会交给同一个reduce。cluster by则就相当于对同一个字段同时进行distributed bysort by。需要注意的是distributed by要放在sort by前面,因为前者运行在shuffle阶段,而后者运行在reduce处理阶段。

Talk is cheap, show me the code

从运行结果来看四者的区别

首先我们新建一份最经典的的员工信息表如下所示:

epno  epdep  epname  emsal
1  1  wangwu  1000
2  1  zhaoliu  1000
3  1  sansi  7000
4  2 hngsan  1000
5  2  wngwu  1000
6  2  zaoliu  1000
7  2  snsi  7000
8  3 hnan  1000
9  3  wwu  1000
10  3  zliu  1000
11  3  si  7000

使用sort by对整个表根据epno进行排序

insert overwrite local directory '/opt/modules/hive/data/1' row format delimited fields terminated by '\t' collection items terminated by '\n' select * from hive.emp sort by epno;

sort by运行结果 one reducer
sort by based one reducer

运行结果如下图所示,sort by是在reduce阶段进行的排序,所以当只有一个reducer的时候,数据是按照epno的大小来进行排序的。

sort by运行结果 two reducer
sort by based on two reducers

当有两个reducer, 使用sort by进行排序,由于sort by是对每个reducer处理的数据进行排序的,所以在每个reducer产生的文件当中epno都是有序的。结果如图下图所示:

使用order by进行排序

insert overwrite local directory '/opt/modules/hive/data/1' row format delimited fields terminated by '\t' collection items terminated by '\n' select * from hive.emp order by epno;

order by排序产生结果
order by运行结果图

order by是表中的每一个数据进行排序的,所以使用order by只会有一个reducer(无论你设置了reducer数量为多少),因为我们要在这个reducer中对表中的所有数据进行排序,但是需要注意的是,当数据特别大的时候,一个reducer会产生可能会让机器爆炸,无法使集群发挥出应有的能力。order by运行的结果如下所示:

使用distribute by进行排序

insert overwrite local directory '/opt/modules/hive/data/1' row format delimited fields terminated by '\t' collection items terminated by '\n' select * from hive.emp distribute by epdep sort by epno;

distributed by运行结果
distriubte by sort by 运行结果图

distributed by有点类似于mapreduce过程中的分区,它会将同一个属性的数据交给同一个reduce处理,如果我们结合sort by进行使用,就可以实现例如对每一个部门输出一个文件,然后每个部门的人按照编号进行书序排列。运行结果如下:

使用cluster by进行排序

insert overwrite local directory '/opt/modules/hive/data/1' row format delimited fields terminated by '\t' collection items terminated by '\n' select * from hive.emp cluster by epno;

cluster by相当于distribute by sort by colum_name,对同一个属性先distributed by 然后再sort by。运行结果如下所示:

cluster by运行结果

Rating: 5.0/5. From 2 votes.
Please wait...