MapReduce框架排序和分组

前言:

        Mapreduce框架就是map->reduce,其中Map中的<key,value>是偏移量和行值,在其之前会使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现。本例子中使用的是TextInputFormat,他提供的RecordReder会将文本的一行的行号作为key,这一行的文本作为value。这就是自定义Map的输入是<LongWritable, Text>的原因。

       之后调用Map类进行split,将其写入环形内存中,待其达到阀值时,对其的80%进行排序排序和分组,这都是在Map和Reduce之间完成,那么下面我们来看看这些函数类

一、分区

参考上一篇博客:http://blog.csdn.net/gamer_gyt/article/details/47339755

二、排序

参考博客:http://blog.csdn.net/gamer_gyt/article/details/48025805

按照Key进行排序,其实在每一个Map函数里就已经默认调用了job.setSortComparatorClass(Comparator.class)类进行了排序,但此时只不过对每一个Map函数接受的value(行值)的排序,这里所说的是map和reduce之间的排序,实现的是对所有的key进行排序

三、分组

job.setGroupingComparatorClass(GroupComparator.class);

如果用户想自定义排序方式,首先需要实现两个Comparator并将其按照上面的格式进行配置。每一个Comparator需要继承WritableComparator基类。如下所示:

public static class GroupComparator extends WritableComparator {
protected GroupComparator() {
super(IntPair.class, true);
}
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
IntPair ip1 = (IntPair) w1;
IntPair ip2 = (IntPair) w2;
return IntPair.compare(ip1.getFirst(), ip2.getFirst());
}
}


这一点在二次排序中深有体现:可以参考http://blog.csdn.net/gamer_gyt/article/details/47315405

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值