Mapreduce程序用于计算文件中的总字数

时间:2015-03-01 09:11:29

标签: hadoop mapreduce

正常的字数统计程序,输出为字,字数。 在reducer中我们写上下文(键,值) 但我想要文件中的总字数,例如,如果文件有hundread字我希望输出为百

5 个答案:

答案 0 :(得分:1)

可以使用计数器实现。 上下文对象可以访问这些计数器。 计数器在每个节点递增,然后最终聚合。

答案 1 :(得分:0)

我想以下应该有效: 1.在Mapper中为每个单词设置Reducer的虚拟键。 2.由于Reducer将接收虚拟键作为键,值将为Iterable,您可以获得所有虚拟记录的总和。

: - )

答案 2 :(得分:0)

我对MapReduce编程也很陌生,我把这个问题作为一种练习。我建议使用以下Mapper和Reducer:

映射器:

import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class TotalWCMapper extends Mapper<Object, Text, NullWritable, IntWritable>{

public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    IntWritable cnt = new IntWritable(itr.countTokens());
    context.write(NullWritable.get(), cnt);
  }
}

减速机:

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;

public class TotalWCReducer extends Reducer<NullWritable, IntWritable, NullWritable, IntWritable> {

public void reduce(NullWritable key, Iterable<IntWritable> values,
        Context context
        ) throws IOException, InterruptedException {
    int sum = 0;
    for (IntWritable val : values) {
        sum += val.get();   
    }
    IntWritable result = new IntWritable(sum);
    context.write(key, result);
  }
}

答案 3 :(得分:0)

对于每个文件中每行的每个单词,make(key,value)为(filename,1),在reducer中总计为1s

答案 4 :(得分:0)

这非常简单。将映射器的键作为文本类型,并将 单词数 作为键, 可写入(1) 值。  在reducer中使用以下代码: -

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

它将产生您需要的输出。如果此解决方案适合您的情况,请接受我的回答。