Как отсортировать настраиваемый тип записи в Hadoop - PullRequest
0 голосов
/ 13 марта 2019

У меня есть пользовательский тип, который содержит поля нативных типов Hadoop (например, Text и IntWritable), и мне нужно использовать его в качестве ключа и сортировать по своему желанию на этапе перемешивания / сортировки. Есть похожие вопросы, такие как этот и этот , но они касаются использования нативных типов. Как добиться того же результата с пользовательским типом, каким требованиям он должен соответствовать?

1 Ответ

0 голосов
/ 13 марта 2019

Есть нюансы для достижения этого результата, некоторые очевидны, другие нет. Я попытаюсь объяснить их в нескольких коротких моментах:

  1. Прежде всего пользовательский тип должен реализовывать WritableComparable вместо просто Writable и, конечно, определять метод compareTo().
  2. Очень важное примечание от Hadoop: полное руководство :

    Все реализации с возможностью записи должны иметь конструктор по умолчанию, чтобы инфраструктура MapReduce могла их создавать, а затем заполнять их поля, вызывая readFields ().

    И, возможно, наиболее подверженной ошибкам часть заключается в том, что конструктор по умолчанию должен создавать экземпляры этих полей (если они не инициализированы), поскольку они не должны быть нулевыми.

  3. Этот момент касается создания пользовательского компаратора, если вы не удовлетворены сортировкой по умолчанию. В этом случае вам нужно создать новый класс, который расширяет WritableComparator и переопределяет его метод compare(). После этого у вас есть два подхода использования этого компаратора вместо стандартного: или , вы устанавливаете этот класс для использования с помощью метода Job * setSortComparatorClass :

    job.setSortComparatorClass(YourComparator.class)
    

    или зарегистрируйте его в статическом блоке вашего пользовательского типа:

    static {  
        WritableComparator.define(CustomType.class, new YourComparator());
    }
    

    Статический блок регистрирует необработанный компаратор, так что всякий раз, когда MapReduce видит класс, он знает, как использовать необработанный компаратор в качестве компаратора по умолчанию.

Здесь - пример такого класса со статическим вложенным компаратором.

...