Этот вопрос для меня немного неясен.Но я думаю, что у меня есть достаточно хорошее представление о том, что вы хотите.
Прежде всего, если вы не делаете ничего особенного каждый раз, когда вызывается редукция, он получает только один ключ с набором из одного или нескольких значений (черезитератор).
Я предполагаю, что вы хотите убедиться, что каждый редуктор получает ровно одну «пару ключ-значение».По сути, есть два способа сделать это:
- Убедитесь в отображении, что все ключи, которые выводятся, являются уникальными.Таким образом, для каждого ключа есть только одно значение.
- Заставьте редуктор сделать это, заставив групповой компаратор, который просто классифицирует все ключи как разные.
Так что, если я правильно понимаю ваш вопрос.Вы должны реализовать GroupComparator, который просто утверждает, что все ключи разные и поэтому должны быть отправлены на другой вызов редуктора.
Из-за других ответов в этом вопросе я добавляю немного больше деталей:
Для сравнения ключей используются 3 метода (я извлек эти примеры кода из проекта, который я делал с использованием API 0.18.3):
Partitioner
conf.setPartitionerClass(KeyPartitioner.class);
Разделитель предназначен только для того, чтобы «вещи, которые должны быть одинаковыми, попадали в один и тот же раздел».Если у вас 1 компьютер, то есть только один раздел, так что это мало поможет.
Key Comparator
conf.setOutputKeyComparatorClass(KeyComparator.class);
Ключевой компаратор используется для сортировки"пары ключ-значение" в группе, глядя на ключ ... который должен как-то отличаться.
Компаратор группы
conf.setOutputValueGroupingComparator(GroupComparator.class);
Компаратор группыиспользуется для группировки ключей, которые отличаются, но должны быть отправлены на тот же редуктор.
HTH