Hadoop - Mapper结果的显式分组

时间:2015-01-08 07:35:09

标签: java hadoop grouping

我编写了映射器代码,其中键作为IntTextPair发出,我想通过IntTextPair中的Int对映射器结果进行分组,如

[1   Shanghai]
[1   Test]
[2   Set]

并且映射器结果应分组为:

[1   Shanghai, Test]
[2   Set]

我已经实现了Comparator类:

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;


public class GroupByInput extends WritableComparator {

    public GroupByInput() {
        super(IntTextPair.class, true);
    }

    @Override
    public int compare(WritableComparable it1, WritableComparable it2) {
        IntTextPair Pair1 = (IntTextPair) it1;
        IntTextPair Pair2 = (IntTextPair) it2;

        return Pair1.getFirst().compareTo(Pair2.getFirst());
    }
}

在配置文件中我设置了比较器类,如下所示:

   Configuration conf = new Configuration();
    Job job = new Job(conf);
   job.setGroupingComparatorClass(GroupByInput.class);

我会朝着正确的方向前进吗?我需要一些帮助

1 个答案:

答案 0 :(得分:0)

您无法合并/合并当前概述的密钥。当前的Mapper输出值类型/类是什么 - 是否有理由不能从映射器输出KV?

如果你确实有另一个类/类型从mapper输出作为Value组件,那么你仍然可以通过以下方式实现这一点:

  1. 您的GroupComparator看起来不错,与IntTextPair的顺序配对意味着具有相同Int组件的所有键将被发送到同一个reducer。
  2. 在您的reducer中,在迭代值时,您可以检查Key以确定键的Text组件的唯一列表。
    • 当你在reducer中迭代值时,不太知道,键的内容也会更新 - 你的分组器对于特定的reduce运行,Int组件总是相同的,但是文本组件可以更改
    • 当键被排序时,您可以跟踪前一个Text组件值(确保在迭代到迭代值中的下一个值之前复制内容)