Я писал приложение MapReduce для выполнения соединения на стороне сокращения на двух таблицах (один из рейсов с внешним ключом идентификатора аэропорта назначения и один из идентификаторов аэропорта сопоставляется с их именами).
Оба набора данных будут, после сопоставления используйте один пользовательский формат CompositeKey (airportID, datasetIndicator), где datasetIndicator = 0 для набора данных аэропортов и 1 для набора данных рейсов.
Затем я бы разделил пары, используя только часть ключа airportID, чтобыубедитесь, что все пары с одним и тем же airportID попадают в один и тот же редуктор.
Используя пользовательский GroupComparator, я бы обеспечил обработку всех пар с одним и тем же идентификатором airportID в одном вызове сокращения.
Теперь я ожидаю, что при уменьшении значение первой пары содержит название аэропорта.
Для полной сортировки ключей я сравниваю сначала datasetIndicator, а затем airportID, однако это дает неверные результаты.,По какой-то причине все аэропорты получают собственные сокращения вызовов без каких-либо связанных рейсов.
Простое изменение порядка сравнения полей в CompositeKey решает проблему.Я не совсем понимаю, почему.
Я предполагаю, что когда GroupComparator завершен, пары в каждой группе отсортированы по полному ключу, поэтому, поскольку здесь все идентификаторы airportID одинаковы, пара (airportID, 0) (который содержит имя в качестве значения) должен стоять сверху, независимо от порядка сравнения полей.
Это не так.Похоже, пары аэропортов и пары рейсов даже не оказываются вместе в одном и том же вызове сокращения.
Единственное изменение в коде - это порядок сравнения полей CompositeKey compareTo ().
Существует ли неявная зависимость результата этапа группировки от порядка пар в разбиении?