0
HashPartitioner<Text,Text> hash=new HashPartitioner<Text,Text>();
@Override
public int getPartition(CompositeKeyClass keyClass, Text valClass, int numOfPartition) {
// TODO Auto-generated method stub
try {
String[] type=valClass.toString().split(",");
if(type[0].equals("Mapper1")) {
return (hash.getPartition(keyClass.getFirst(), valClass, numOfPartition))%numOfPartition;
} else {
return (hash.getPartition(keyClass.getFirst(), valClass, numOfPartition))%numOfPartition;
}
}
}
上記のコードをPartitionerクラスで使用してカスタムクラスのキーを取得しています。すべて正常に動作しますが、テキスト "Mapper1"が最初のレデューサーに送信され、もう1つが2番目に送信された値が必要です。それをどうすれば実現できますか?私はjob.numOfReduceTaks
を2に設定しました。助けてください!カスタムキーの場合にカスタムパーティショナーのnumReduceTaskを設定するには
どうすればgetPartitionメソッドを返すことができますか?レデューサーに適切なキーを送るには、キークラスで返す必要があります。 –
@AmardeepSinghまあ、私はおそらくあなたが言うことを得ていない。 getPartition()メソッドは単にint(つまり、0 <=パーティション番号
基本的に私はカスタムキークラスのカスタムパーティショナー。次のコードは、Reducerが1つだけの場合に機能します。 2つのレデューサーが必要な場合にどのように対応できるようにするにはどうすればよいですか?インライン '\tパブリック静的クラスパーティションはパーティション分割 \t { \t \t \t \tプライベートHashPartitioner ハッシュ=新しいHashPartitioner ()を拡張します。 \t \t @Override \t \t公共INT getPartition(CompositeKeyキー、テキストのVal、int型NUM){ \t \t \t \t戻りhash.getPartition(key.getFirst()、ヴァル、NUM)%のNUM。 \t \t \t \t \t} –