java多输入分组比较器

icomxhvb  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(320)

我有两个来源的信息:
在窗体中Map输出,

output.collect(new StockKey(Text(x+" "+id), new Text(id2)), new Text(data));

在窗体中Map输出,

output.collect(new StockKey(new Text(x+" "+id), new Text(1), new Text(data));

作业配置:

conf.setPartitionerClass(CustomPartitioner.class);
 conf.setValueGroupingComparatorClass(StockKeyGroupingComparator.class);

其中stockkey是一个自定义的格式类 (new Text(), new Text()) ;
施工单位:

public StockKey(){
    this.symbol = new Text();
    this.timestamp = new Text();
}

分组比较器:

public class StockKeyGroupingComparator extends WritableComparator {

    protected StockKeyGroupingComparator() {
        super(StockKey.class, true);
    }  

    public int compare(WritableComparable w1, WritableComparable w2){
        StockKey k1 = (StockKey)w1;
        StockKey k2 = (StockKey)w2;

        Text x1 = new Text(k1.getSymbol());
        Text x2 = new Text(k2.getSymbol());

        return x1.compareTo(x2);

    }

}

但我并没有从输入中接收map输出值
我得到的只是Map的输出值到达了减速机。我要有符号的唱片 new Text(x+" "+id) 这两个Map输出共用,将分组到同一个减速机。我被打动了。
请帮帮我!

9ceoxa92

9ceoxa921#

要做到这一点,您需要一个符合以下条件的分区器:
Map器将一堆记录作为键/值对输出
对于每个记录,分区器都会被传递键、值和还原数。分区器决定哪个reducer将处理记录
记录被传送到各自的分区(还原器)
运行groupingcomparator来决定哪些键值对被分组到一个iterable中,以便对reducer()方法进行一次调用
等等。。。
我认为默认的分区器是根据键的整个值为每个记录选择reducer分区(这是默认行为)。但您希望记录只按部分键分组(只按符号分组,不按符号和时间戳分组)。因此,您需要编写一个分区器来执行此操作,并在driver类中指定/配置它。
一旦你这样做了,你分组比较器应该帮助分组记录,因为你的意图。
编辑:随想
如果您将时间戳移动到值,使键简单(只是符号)而值复杂(时间戳和值),您可能会使事情变得更简单。这样就不需要分区器或分组比较器了。
你没有说任何一种方式,但你确实使用了multipleinputs类,对吧?这是为同一个作业调用两个或多个Map器的唯一方法。

相关问题