2013-09-25 1 views
0

Я просто смущен, что все встроенные записи, такие как IntWritable, FloatWritable, GenericWritable и т. Д., Используют исходный компаратор для сравнения по умолчанию? Если нет, как мы должны регистрировать их для использования rawcomparator.Использует ли все встроенные записи возможность использовать стандартный компаратор по умолчанию?

ответ

2

Как получить RawComparator в JobConf.getOutputKeyComparator:

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. Если он не установлен, hasoop попытается преобразовать класс ключа в WritableComparable и использовать его для создания WritableComparator. Поэтому, если мы не настроим нашего клиента RawComparator, введите WritableComparator.get.

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, когда они загружены, они будут ссылаться на define поставить их WritableComparator (например, org.apache.hadoop.io.IntWritable.Comparator) к comparators. Так что если вы хотите зарегистрировать свой пользовательский RawComparator, вы можете использовать коды, такие как (Вы должны убедиться, что эти коды в вашем теле класса Writable):

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

Далее, что произойдет, если WritableComparable не регистрирует WritableComparator ? Это поведение по умолчанию WritableComparator. Он будет ссылаться на WritableComparable.compareTo, чтобы сравнить два ключа.

Смежные вопросы