2014-04-19 2 views
0

Я нашел эту разницу смущало меняРезультаты Hadoop спутанность

Первоначально я хотел, чтобы вычислить количество записей в редукторе путем накопления 1 на каждом шаге, код выглядит следующим образом:

Пара вход <Text, DoubleWritable>, и все записи имеют один и тот же ключ «один». Есть 160000 записей

public void reduce(Text key, Iterator<DoubleWritable> values, OutputCollector<Text, DoubleWritable> output, Reporter reporter) throws IOException { 
    double count = 0; 
    while(values.hasNext()){ 
     count = count + 1; 
    } 
    output.collect(new Text("Count"), new DoubleWritable(count)); 
} 

Выход 22

После того, как изменить вход редуктора к <Text, Text>, Значение ключа является одинаковым для всех записей «один», а значение «1»

код становится:

public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, DoubleWritable> output, Reporter reporter) throws IOException { 
    double count = 0; 
    String s = ""; 
    while(values.hasNext()){ 
     s = values.next().toString(); 
     count = count + Integer.parseInt(s); 
    } 

    output.collect(new Text("Count"), new DoubleWritable(count)); 
} 

Теперь ответ является правильным: 160000

Кажется, что число итераций цикла while должно быть одинаковым в каждом случае. Почему результаты разные?

+0

Как выглядит ваш конфигуратор карт и работы? – Scott

+1

Является ли ваш редуктор также объединителем? – climbage

+0

@climbage Извините за поздний ответ. Да, я установил объединитель так же, как редуктор. – user2517984

ответ

0

Проблема в том, что логика ваших двух примеров на самом деле отличается. В первом случае вы считаете только количество пар ключ/значение, переданных редуктору.

Чтобы быть логически эквивалентным, вам нужно изменить count = count + 1 на номер count = count + iter.next().get(), чтобы получить сумму значений.

Причина этого заключается в том, что ваш редуктор также является объединителем. Поэтому к моменту, когда пары ключ/значение попадают на ваш редуктор, они уже частично суммированы (объединены).

Count 1700 
Count 42 
Count 5640 
... 
+0

Спасибо! Я отключил объединитель и получил правильный результат. Итак, вместо подсчета количества записей мой первый случай фактически подсчитывает количество кусков после объединения? – user2517984

+0

Да, это то, что происходит. – climbage

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