1 . order by

order by实现的是对输入的数据进行全局排序,可以有ASC升序(默认)和DESC降序,与mysql等数据库中order by的用法一样。

因此只在一个reducer中实现,因为多个reducer就无法保证全局数据有序;

但当只有一个reducer时,若输入数据的规模较大时,所需要的计算时间就会过长,效率低下。

 

2 . sort by

sort by并不是全局排序,而是每个reduce内部进行单独排序,对全局结果集来说不保证全局有序,其在数据进入reducer前完成排序。

因此若想使用sort by,一般设置set mapreduce.job.reduces=n,(n>1),这样就可以保证每个reducer的输出是有序的,且结果是会根据reducer的个数分成几个文件输出且每个文件会按照指定的字段排序,但是并不保证全局有序。

总之sort by与order by不同,sort by只是保证在同一个reduce中的数据可以按指定字段排序。而若设置set mapreduce.job.reduces=1则和order by效果一样。

 

3 . distribute by

distribute by是作用在map端如何拆分数据给reduce端的。在hive中会根据distribute by后面的列,按照hashCode值对reduce的个数取模,类似于MapReduce阶段的patition分区过程,默认根据key.hashCode()&Integer.MAX_VALUE%numReduce 确定处理该任务的reduce。

在使用sort by时会为每个reduce产生一个排序文件,虽然有些类似于distribute by分区的效果,但是在sort by中的分区(或者说类似于分区)是随机分的,并不是按照某一列来分的;

而distribute by是根据特定的列来进行分区,然后再通过sort by来进行每个分区的排序,所以说distribute by经常和sort by配合使用。

注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

而且对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

 

4 . cluster by

当distribute by和sort 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;

这两条语句的效果是一样的=。=


若以上解释有不当之处,真诚欢迎各位师长、同行等提出宝贵意见=。=。

我是小K,大数据刚入门,希望踩过的坑对正在入门的你有帮助。在路上,再出发=。=