Hadoop MapReduce获取每个单词的百分比

时间:2015-12-07 04:01:26

标签: hadoop percentage word

我正在使用Hadoop Mapreduce来获取单词和单词计数信息。除了每个单词的计数外,我还需要找到文档中显示的每个单词的百分比。输出是这样的。 如果文件只包含三个单词" hello"," world"和" kitty"。结果应该是这样的。

字数百分比

你好40 0.4

世界50 0.5

kitty 10 0.1

我可以设置int temp = arr[i]; 来计算所有单词,问题是结果将在每个单词计数返回的同时返回。将每个单词输出到hdfs时,无法计算当时的百分比。

2 个答案:

答案 0 :(得分:1)

您可以在Mapper中设置计数器。

  1. 增加一个全局计数器,用于在从映射器中发出单词时计算单词总数。
  2. 获取减速器中的计数器以获得发出的单词总数。
  3. 使用常规方法计算百分比。

答案 1 :(得分:0)

job.setJarByClass(WinnerCount.class);
    job.setMapperClass(WinnerCountMapper.class);
    //job.setCombinerClass(WinnerCountCombiner.class);
    job.setCombinerClass(WinnerCountCombiner.class);
    job.setReducerClass(WinnerCountReducer.class);
    job.setInputFormatClass(ChessInputFormat.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(inputPath));
    FileOutputFormat.setOutputPath(job, temp);


    job.waitForCompletion(true);

    Counters counters = job.getCounters();
    Counter total = counters.findCounter(WinnerCountMapper.MAP_COUNTER.TOTAL_TUPLE);
    //System.out.println(total.getDisplayName()+":"+total.getValue());

    /*if (hdfs.exists(output))
        hdfs.delete(output, true);*/

    Configuration conf2 = new Configuration();
    conf2.set("total", total.getValue()+"");
    Job job2 = Job.getInstance(conf2,"aggregation");

    job2.setJarByClass(WinnerCount.class);
    job2.setMapperClass(AggregationMapper.class);
    job2.setReducerClass(AggregationReducer.class);
    job2.setOutputKeyClass(Text.class);
    job2.setOutputValueClass(Text.class);