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
検索します。WritableComparator
comparators
Writable
IntWritable などのほとんどの組み込み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.compareTo
2 つのキーを比較します。