2017-03-27 77 views
1

我正在學習mapreduce。從MapReduce WordCount所示的WordCount示例開始,當我在eclipse中執行代碼時,它的輸出是正確的字數。 I/P文件內容如下: -Mapreduce WordCount錯誤輸出示例

的Hello World再見世界

它的輸出是

再見1

你好1

世界2

之後,我通過在輸入文件中的每個單詞之後用逗號替換空格來測試代碼。

現在我已將輸入恢復爲與之前相同,但現在輸出中的WordCount是預期結果的兩倍。

再見2

你好2

世界4

我的代碼如下:

public static class TokenizerMapper extends Mapper<Object, Text, Text,IntWritable>{ 
    public static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException{ 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()){ 
      word.set(itr.nextToken()); 
      context.write(word, one); 
     } 
    } 
} 

public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ 
    private IntWritable result = new IntWritable(); 
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ 
     int sum=0; 
     for(IntWritable val:values){ 
      sum +=val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
} 

public static void main(String[] str) throws Exception{ 
    Configuration conf = new Configuration(); 
    Job job = Job.getInstance(conf, "word count"); 

    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    FileInputFormat.addInputPath(job, new Path(str[0])); 
    FileOutputFormat.setOutputPath(job,new Path(str[1])); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 


} 

可有人還解釋如何值是由每個分組Reducer Method中的單詞,因爲它正在對特定單詞的每個值進行求和在哪裏檢查兩個計數是否存在同一個詞。

感謝

+0

刪除相同的輸入文件夾中的tmp文件的輸入路徑: ) – vefthym

+0

@vefthym是的,你是對的。有一個tmp文件被創建。你可以讓我知道爲什麼這個tmp文件被創建。 – Manish

回答

2

你必須給定的輸入文件夾中,您必須有兩個文件具有相同的內容和可能的原因雙倍計數

+0

這是真的,我給輸入文件夾作爲路徑,但只有一個文件。 – Manish

+0

是的,你是正確的。其他文件沒有通過UI顯示。當我通過終端檢查時,它的名字是「file01〜」。我刪除了它,現在它正在工作。你能讓我知道爲什麼這個文件是在那裏創建的。你也可以在帖子中幫助我解決另一個問題。 – Manish

+0

我已經試過你的代碼,它給了我正確的結果,只是嘗試給文件路徑,而不是文件夾路徑作爲輸入 –