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

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

问题

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值