2 つのソースからの入力があります。
フォームのマップ出力、
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 は format のカスタム クラスです(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);
}
}
しかし、入力からマップ出力値を受け取っていません
マップ出力値のみがレデューサーに到達します。new Text(x+" "+id)
両方のマップ出力から共通のシンボル viz を持つレコードを同じレデューサーにグループ化する必要があります。ここで心打たれます。
助けてください!