0

レデューサーから次の出力があります

    Key            Value
1 1998-01-05         45
10 1998-01-09        20
2 1998-01-06         68
3 1998-01-07         85
4 1998-01-08         85

辞書式順序ではこれは正しいですが、自然な順序で並べ替えたいです。

  Key              Value
1 1998-01-05         45
2 1998-01-06         68
3 1998-01-07         85
4 1998-01-08         85
10 1998-01-09        20

私はこれを達成するためにKeyComparatorを作成しました。以下はコードですが、これでもうまくいきませんでした。

public static class KeyComparator extends WritableComparator {
            protected KeyComparator() {
                    super(IntWritable.class, true);
            }

            @SuppressWarnings("rawtypes")
            public int compare(WritableComparable w1, WritableComparable w2) {
                    IntWritable t1 = (IntWritable) w1;
                    IntWritable t2 = (IntWritable) w2;
                    String t1Items = t1.toString();
                    String t2Items = t2.toString();
                    return t1Items.compareTo(t2Items);
            }
    }

私のマッパー出力はレデューサーと同じ形式ですが、レデューサーは最大値を出力しているだけです。

私は何が欠けていますか

4

3 に答える 3

3

値を比較するのではなく、文字列を比較しています。「10」<「2」なのに10> 2

IntWritableから最初のフィールドを取得するか、最初の数値を解析して比較する必要があります。

ところで:を使用する場合は、すべてがこのメソッドをサポートtoString()しているため、最初にキャストする必要はありません。Object

于 2012-11-06T12:57:29.873 に答える
2

文字列を比較しています

               String t1Items = t1.toString();
               String t2Items = t2.toString();
               return t1Items.compareTo(t2Items);

あなたはこれをすべきではありません。代わりに数値を比較してください。私には何IntWritableがわからないのですが、そこから文字列を作成するべきではありません。整数を抽出し、それらを直接比較します。

于 2012-11-06T12:57:37.387 に答える
1

この場合の正しい方法は簡単な方法です。

public int compare(WritableComparable w1, WritableComparable w2) {
  return w1.compareTo(w2);
}

IntWritableすでにComparable適切な方法でインターフェースを実装しています。

そうは言っても、カスタムコンパレータクラスは必要ないかもしれません。

于 2012-11-06T13:10:31.927 に答える