Карта уменьшить количество слов пример не работает
Я пытаюсь реализовать пример подсчета слов сам, вот моя реализация маппера:
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
Text word = new Text();
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, new IntWritable(1));
}
}
}
и редуктор:
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
while (values.hasNext())
sum += values.next().get();
context.write(key, new IntWritable(sum));
}
}
но вывод, который я получаю для выполнения этого кода, похож на вывод только mapper, например, если ввод "hello world hello", вывод будет
hello 1
hello 1
world 1
Я также использую объединитель между отображением и сокращением. Может кто-нибудь объяснить мне, что не так с этим кодом?
Большое спасибо!
2 ответа
Решение
Замените метод сокращения на этот:
@Override
protected void reduce(Text key, java.lang.Iterable<IntWritable> values, org.apache.hadoop.mapreduce.Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException,
InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
Итак, суть в том, что вы не переопределяете правильный метод. @Override помогает с такого рода ошибками.
Также убедитесь, что вы установили Reduce.class в качестве Reduce Class, а не Reducer.class!
;) HTH Йоханнес
Если вы не хотите играть с аргументами метода Reduce во время переопределения, альтернативное решение может быть:
@Override
protected void reduce(Object key, Iterable values, Context context) throws
IOException, InterruptedException {
int sum = 0;
Iterable<IntWritable> v = values;
Iterator<IntWritable> itr = v.iterator();
while(itr.hasNext()){
sum += itr.next().get();
}
context.write(key, new IntWritable(sum));
}