マップ出力キーをレデューサーに逆の順序で取得するための最良の方法は何ですか? デフォルトでは、リデューサーはキーの昇順ですべてのキーを受け取ります。ヘルプやコメントは大歓迎です。
簡単に言えば、通常のシナリオでは、マップがキー1,4,3,5,2を発行する場合、リデューサーは1,2,3,4,5と同じものを受け取ります。代わりにレデューサーに5,4,3,2,1を受け取ってもらいたいです。
Hadoop 1.Xでは、を使用して出力のカスタムコンパレータクラスを指定できますJobConf.setOutputKeyComparatorClass
。
コンパレータはRawComparator
インターフェースを実装する必要があります。
Hadoop 2.Xでは、これはを使用Job.setSortComparatorClass
して実行されますが、実装は引き続きですRawComparator
。
サンプル、簡単なコード
class MyKeyComparator extends WritableComparator {
protected DescendingKeyComparator() {
super(Text.class, true);
}
@SuppressWarnings("rawtypes")
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
Text key1 = (Text) w1;
Text key2 = (Text) w2;
return -1 * key1.compareTo(key2);
}
}
次に、それをジョブに追加します
job.setSortComparatorClass(MyKeyComparator.class);
使用状況に応じて、以下のテキスト タイプを変更できます。
Text key1 = (Text) w1;
Text key2 = (Text) w2;