我有来自两个来源的输入:
以表格形式输出地图
output.collect(new StockKey(Text(x+" "+id), new Text(id2)), new Text(data));
以表格形式输出地图
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);
}
}
但我没有从输入
接收地图输出值我只得到地图输出值到达reducer。我希望将具有符号viz new Text(x+" "+id)
的记录从两个地图输出中共同分组到同一个reducer。我很震惊。
请帮忙!
答案 0 :(得分:1)
要做到这一点,你需要一个适合如下的分区:
我认为默认分区程序是根据键的整个值选择每个记录的reducer分区(这是默认行为)。但是,您希望记录仅按键的一部分(只是符号而不是符号和时间戳)。因此,您需要编写一个执行此操作的分区程序,并在驱动程序类中指定/配置它。
一旦你这样做,你正在分组比较器应该按照你的意图帮助分组记录。
编辑:随意的想法