IntWritable、FloatWritable、GenericWritable などのすべての組み込みの書き込み可能なものは、デフォルトで比較のために raw コンパレータを使用するのでしょうか? そうでない場合、rawcomparator を使用するためにそれらをどのように登録する必要がありますか。
1 に答える
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 は、ロードされると、呼び出しdefineてWritableComparator(たとえば、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 つのキーを比較します。