2016-05-20 2 views
-2

Я пытаюсь треска следующий в моем редукторе и ошибка компиляции превращается следующим образом:Итератора не позволяет в редукторе

Метод collect(Text, Text) в типе OutputCollector<Text,Text> не применяется для аргументов (Text, Iterator<Text>)

public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {    
    output.collect(key, values); 
} 

насколько я знаю, выход map <K,V> перемешиваются и сортируют, который формирует коллекцию для ввода редуктора.

Могу ли я узнать причину ошибки?

+1

Я думаю, что сообщение об ошибке достаточно говорит, что все это ... 'Метод сбора (текст, текст) в типе OutputCollector не применяется для аргументов (текст, итератора )', что означает, что 'values' является' Iterator ', когда он должен быть' Text' – vefthym

ответ

4

Проблема, вызываемая сообщением об ошибке, заключается в том, что подписи типа OutputCollector<K,V> и метод collect(K,V) должны совпадать.

В этом случае они не совпадают, потому что вы объявили

OutputCollector<Text, Text> output 

но попытался вызвать

output.collect(key, values); 

с типом values быть Iterator<Text>, который не совпадает с типом значения Text для значения, ожидаемого вашим OutputCollector<Text,Text>.

0

Причина ошибки, поскольку paisanco states является то, что values итератор, когда вы объявили через OutputCollector<Text, Text>, что ключ выход будет иметь тип Text и выходное значение также будет иметь тип Text.

Для того, чтобы решить эту проблему, вы можете:

  • установить IdentityReducer как ваш редуктор (для данной конкретной задачи), позвонив по телефону setReducerClass(IdentityReducer.class); в драйвере, или не указание какого-либо класса редуктора (IdentityReducer является стандартным редуктором).

  • Изменение уменьшить метод как:

    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { 
        for (Text value: values) {    
         output.collect(key, value); //value is of type Text 
        } 
    } 
    

    , который является не более чем реализация редуктора идентичности.

+0

Итак, как это изменится при реализации IdentityReducer? – Sri

+0

@Sri, как бы изменилось? Редуктор идентичности - это не то, что у вас есть. Это то, что я описываю во второй пуле. Две пули, которые я описываю как альтернативы, эквивалентны, если это то, о чем вы просите. – vefthym