пример уменьшения количества слов на карте не работает

Я пытаюсь реализовать пример подсчета слов самостоятельно, вот моя реализация картографа:

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));
    }
}

но вывод, который я получаю для выполнения этого кода, выглядит как вывод только картографа, например, если ввод «привет, мир, привет», вывод будет

hello 1
hello 1
world 1

Я также использую объединитель между отображением и уменьшением. Может ли кто-нибудь объяснить мне, что не так с этим кодом?

Большое спасибо!


person Thien    schedule 26.03.2011    source источник


Ответы (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 как класс сокращения, а не Reducer.class!

;) HTH Йоханнес

person oae    schedule 26.03.2011
comment
Спасибо за это. Я застрял на этой проблеме в течение дня или двух. - person rOrlig; 26.04.2011

Если вы не хотите играть с аргументами метода уменьшения при переопределении, альтернативным решением может быть:

@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));
}
person Prashant_M    schedule 03.09.2017