1

以下のコードを修正して、少なくとも 10 回出現する単語を出力しました。しかし、それは機能しません。出力ファイルはまったく変更されません。それを機能させるにはどうすればよいですか?

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

4 に答える 4

1

コードは完全に有効に見えます。あなたのデータセットは十分に大きいので、単語がたまたま10回以上表示されているのではないかと思います。あなたが本当に新しい結果を調べていることを確認してください。

于 2012-03-14T12:17:47.273 に答える
0

デフォルトの Hadoop カウンターを表示して、何が起こっているかを把握できます。

于 2012-03-14T14:52:57.357 に答える
0

コードは間違いなく正しいです。コードを変更する前に生成された出力を読んでいるのかもしれません。または、コードを変更した後に以前使用していた jar ファイルを更新していない可能性がありますか?

于 2012-03-14T20:25:44.327 に答える
0

コードは有効に見えます。あなたを助けることができるようにするには、少なくともこれを実行するために使用したコマンドラインが必要です. このようなファイルをフィードすると、実際の出力を投稿できると助かります。

one
two two
three three three

その他 20時まで

于 2012-03-14T20:26:30.333 に答える