0

IntWritable、FloatWritable、GenericWritable などのすべての組み込みの書き込み可能なものは、デフォルトで比較のために raw コンパレータを使用するのでしょうか? そうでない場合、rawcomparator を使用するためにそれらをどのように登録する必要がありますか。

4

1 に答える 1

2

JobConf.getOutputKeyComparatorRawComparatorで isを取得する方法:

  public RawComparator getOutputKeyComparator() {
    Class<? extends RawComparator> theClass = getClass("mapred.output.key.comparator.class",
            null, RawComparator.class);
    if (theClass != null)
      return ReflectionUtils.newInstance(theClass, this);
    return WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class));
  }

Hadoop はRawComparatorからクラス名を取得しようとしますmapred.output.key.comparator.class。設定されていない場合、hadoop はキー クラスを に変換しWritableComparable、それを使用してWritableComparator. したがって、 customer を設定しない場合は、 WritableComparator.getRawComparatorと入力します。

  public static synchronized 
  WritableComparator get(Class<? extends WritableComparable> c) {
    WritableComparator comparator = comparators.get(c);
    if (comparator == null) {
      // force the static initializers to run
      forceInit(c);
      // look to see if it is defined now
      comparator = comparators.get(c);
      // if not, use the generic one
      if (comparator == null) {
        comparator = new WritableComparator(c, true);
      }
    }
    return comparator;
  }

では、最初に をマップでWritableComparator.get検索します。WritableComparatorcomparators

WritableIntWritable などのほとんどの組み込みs は、ロードされると、呼び出しdefineWritableComparator(たとえば、org.apache.hadoop.io.IntWritable.Comparator) をcomparators. したがって、カスタムを登録する場合は、次のようなコードを使用できます (これらのコードがクラス本体RawComparatorにあることを確認する必要があります)。Writable

  static {                                        // register this comparator
    WritableComparator.define(IntWritable.class, new Comparator());
  }

次に、 aが aWritableComparableを登録しない場合はどうなりWritableComparatorますか? これがWritableComparatorのデフォルトの動作です。を呼び出してWritableComparable.compareTo2 つのキーを比較します。

于 2013-09-25T05:43:45.650 に答える