Я нашел эту разницу смущало меняРезультаты 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 должно быть одинаковым в каждом случае. Почему результаты разные?
Как выглядит ваш конфигуратор карт и работы? – Scott
Является ли ваш редуктор также объединителем? – climbage
@climbage Извините за поздний ответ. Да, я установил объединитель так же, как редуктор. – user2517984