Неожиданный вывод из числа слов Hadoop - PullRequest
1 голос
/ 14 марта 2012

Я изменил приведенный ниже код для вывода слов, которые встречались не менее десяти раз. Но это не работает - выходной файл не меняется вообще. Что мне нужно сделать, чтобы это заработало?

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.util.*;
// ...
public class WordCount extends Configured implements Tool {
// ...
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);
        while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            context.write(word, one);
        }
    }
}

public static class Reduce extends
        Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values,
            Context context) throws IOException, InterruptedException {

        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
                    // where I modified, but not working, the output file didnt change
        if(sum >= 10)
        {
            context.write(key, new IntWritable(sum));
        }
    }
}

public int run(String[] args) throws Exception {
    Job job = new Job(getConf());
    job.setJarByClass(WordCount.class);
    job.setJobName("wordcount");

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    job.setMapperClass(Map.class);
    //job.setCombinerClass(Reduce.class);
    job.setReducerClass(Reduce.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    boolean success = job.waitForCompletion(true);
    return success ? 0 : 1;
}

public static void main(String[] args) throws Exception {
    int ret = ToolRunner.run(new WordCount(), args);
    System.exit(ret);
}
}

Ответы [ 4 ]

1 голос
/ 14 марта 2012

Код выглядит полностью действительным. Я могу подозревать, что ваш набор данных достаточно большой, поэтому слова появляются более 10 раз? Пожалуйста, убедитесь, что вы действительно ищете новые результаты ..

0 голосов
/ 15 марта 2012

Код выглядит правильно. Чтобы помочь вам, нам нужна как минимум командная строка, которую вы использовали для запуска этого. Также было бы полезно, если бы вы могли опубликовать фактический вывод, если вы передадите ему файл, подобный этому

one
two two
three three three

и т. Д. До 20

0 голосов
/ 15 марта 2012

Код определенно правильный, возможно, вы читаете вывод, сгенерированный до того, как вы изменили код.Или, может быть, вы не обновили файл jar, который ранее использовали после изменения кода?

0 голосов
/ 14 марта 2012

Вы можете видеть счетчики Hadoop по умолчанию и иметь представление о том, что происходит.

...