新年的第一天,希望远在几百公里外的她现在睡得正香
问题:
在学习hive的时候,面对一些东西,总是模棱两可。直接切入话题,sort by和order by的联系与区别。
分析:
hive中的order by语句和其它的sql一样,都会对查询结果集进行全局排序,也就是说所有的数据集都会汇集到一个reduce当中去进行排序,对于大数据集,这个过程可能会消耗太过漫长的时间来执行。
hive增加了一个可以选择的方式,那就是sort by。只会在每个reduce里面进行排序,什么意思呢?如果reduce只有一个的话,那么sort by 和 order by的功能就是一样的,都是对全局进行一个排序,如果reduce的个数多余1个的话,作用就不一样了。sort by如果有两个reuce,那么查询集会分到两个reduce里面。分别在每一个reduce里面进行局部排序,最后将局部排序后的数据汇总起来,这样可以提高全局排序的效率。
实践证明:
首先看一个数据集
在上面的图中,就是order by的结果,因为order by只在一个reduce里面进行全局排序。
下面我们看一下只有一个reduce时的sort by。
可以看出来,在只有一个reduce的时候,sort by和order by发挥的作用是一致的。
下面来看reduce为2的情况下,sort by的结果是否还是全局排序。
- 首先设置reduce的个数为2
2.在reduce个数为2的情况下的执行信息
3.reduce个数为2的执行结果
可以看到,我们最后的结果集并不是完全有序的,是每个reduce里面的局部有序,汇总到一块。只能保证每个reduce里面的结果是局部有序的,不同的reduce的输出就可能会有重叠
总结:关于sort by和order by,通常用的都是Order by。什么时候用sort by呢?当不想hdfs的小文加比较多的时候,我们可以用distuibuted by 和 sort by进行控制小文件的数量。
今天晚上,我会将sort by和distuibuted by的用法写给大家。