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