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

63lcw9qa  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(301)

一个正常的字数统计程序,输出的是字,字数。在reducer中,我们编写上下文(键、值),但我希望文件中的总字数,例如,如果文件中有多余的字,我希望输出为100

fjaof16o

fjaof16o1#

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

fnx2tebb

fnx2tebb2#

很简单。将Map器的键设为文本类型,并将字数设为键,将intwritable(1)设为值。在减速器中使用以下代码:-

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));
    }
}

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

q43xntqr

q43xntqr3#

我对mapreduce编程也很陌生,我把这个问题当成了一种练习。我建议使用以下Map器和还原器:
Map器:

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);
  }
}
juzqafwq

juzqafwq4#

我想下面应该可以:1.为每个单词在Map器中的reducer设置一个虚拟键。2.由于reducer将接收dummy作为键,并且值是iterable,因此您可以得到所有dummy记录的总和。
:-)

vecaoik1

vecaoik15#

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

相关问题