问题
sort by:只保证每个 reducer 的输出有序,不保证全局有序。
学习Hive SQL的sort by进行的一次测试,如下所示:
set mapreduce.job.reduces=2;
select * from student sort by age desc;
3 ww male 22 maths
1 zs male 20 maths
4 zl male 19 english
5 sq male 17 chinese
2 ls female 21 english
6 qb female 18 chinese
在这里将reducer数量设为2,验证sort by局部排序的作用。根据查询结果,可以推断前面四行由一个 reducer 处理,后面 2 行由另一个 reducer 处理。
记录
查询结果看似按 sex 进行了分组,但这只是一个巧合。实际上,此处sort by age是转化为了MapReduce任务,reduce数量为二,即map阶段分成了两个分区,且是根据age(key)来进行的分区,验证如下:
MapReduce默认使用的分区函数是HashPartitioner,源码如下:

模拟HashPartitioner流程如下:

结果如下:

由于reduce数量为2,故而取余后只有1、0两种结果,经过验证,sort by结果前四行age运算后结果相同,后两行运算后结果相同,所以Map阶段分区的结果应该是sort by结果前四行为一个分区,后两行为一个分区,分区之后再在Reduce中完成排序,结果符合推断。

文章探讨了HiveSQL中的sortby操作,指出它仅保证每个reducer的输出有序,而非全局有序。通过设置reducer数量为2并分析查询结果,展示了sortby如何转化为MapReduce任务,其中HashPartitioner按照age进行分区。实验显示,由于reduce数量限制,数据被分成两个分区并在reduce阶段完成排序,证实了sortby的局部排序性质。
3048

被折叠的 条评论
为什么被折叠?



