【Hive学习】对于HiveSQL底层是MapReduce的一次记录

问题

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中完成排序,结果符合推断。

猜你喜欢

转载自blog.csdn.net/treesorshining/article/details/129656192
今日推荐