Hive中,order by、sort by 和 distributed by 分别代表三种不同的排序方法,虽然都是排序,但是它们的功能是不一样的。
简单来说,order by
的功能和在SQL中的功能是一样的,对每一条数据根据特定属性进行排序。而sort by
则是在reduce内部对每个数据根据特定属性进行排序。distributed by
则有点类似于mapreduce的分区,对于同一个属性字段的会交给同一个reduce。cluster by
则就相当于对同一个字段同时进行distributed by
和sort 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
是在reduce阶段进行的排序,所以当只有一个reducer的时候,数据是按照epno的大小来进行排序的。
sort by运行结果 one reducer
当有两个reducer, 使用sort by进行排序,由于sort by是对每个reducer处理的数据进行排序的,所以在每个reducer产生的文件当中epno都是有序的。结果如图下图所示:
sort by运行结果 two reducer
使用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
只会有一个reducer(无论你设置了reducer数量为多少),因为我们要在这个reducer中对表中的所有数据进行排序,但是需要注意的是,当数据特别大的时候,一个reducer会产生可能会让机器爆炸,无法使集群发挥出应有的能力。order by
运行的结果如下所示:
order by排序产生结果
使用distributed 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
有点类似于mapreduce过程中的分区,它会将同一个属性的数据交给同一个reduce处理,如果我们结合sort by
进行使用,就可以实现例如对每一个部门输出一个文件,然后每个部门的人按照编号进行书序排列。运行结果如下:
distributed 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运行结果