二次排序中 map prtitioner combokey.comparetor(组合排序对比函数) reduce 和分组管理器(GroupComparetor)的运行先后顺序

二次排序中 map prtitioner combokey.comparetor(组合排序对比函数) reduce 和分组管理器(GroupComparetor)的运行先后顺序

在这里插入图片描述

在这里插入图片描述

文件为txt文本 内容为年份 和温度 如
1997 50

由上图可知
map端
运行先后顺序是map先读取一行的文本 然后切割处理 之后调用自定义分区类(partitioner)进行分区 然后读取下一组然后切割 分区 。。。。

reduce
map端完全结束后
map传过来的数据 首先进行排序 普通排序为对key排序 二次排序为对combokey排序 当排序完全结束后 reduce将会从上到下的顺序读取数据 例如图中最后的4组数据

============ reduce
2046 : 400
GroupComparetor 2046 : 400 2046 : 11
2046 : 11
GroupComparetor 2046 : 400 2046 : -7
2046 : -7
GroupComparetor 2046 : 400 2046 : -17

====================reduce
2067 : -17

reduce是在排好序的数据中读取数据 并且在读取的过程中进行分组 即每读取一行数据时判断他是否与上一组数据同一组如果不同 则将它定义为新的一组

public class YearGroupComparator extends WritableComparator{
protected YearGroupComparator(){
    super(Combokey.class,true);
}
public int compare(WritableComparable o1, WritableComparable o2) {
    Combokey k1 = (Combokey)o1;
    Combokey k2 = (Combokey)o2;
    return k1.getYear()-k2.getYear();
}
}

这是上诉过程中reduce的代码 当 return k1.getYear()-k2.getYear(); 的返回值为0时 则判断这一组满足你所定义的分组条件 他们判为同一组 否则则判为不同组 将定义为新组

所以在二次排序中要在map端重写分区函数 否则本应该同组的数据就分在不同reduce中的不同组中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值