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

Hadoop Mapreduce程序,用于计算文件中的总字数,hadoop,mapreduce,Hadoop,Mapreduce,一个正常的字数计算程序的输出是字,字数。 在reducer中,我们编写上下文(键、值) 但我想要文件中的总字数,例如,如果文件中有大量的单词,我希望输出为100个 1.在映射器中为每个单词的Reducer设置一个虚拟键。 2.由于Reducer将接收dummy作为键,并且值是可编辑的,因此您可以获得所有dummy记录的总和 :-)我对MapReduce编程也很陌生,我把这个问题当作一种练习。我建议使用以下映射器和还原器: 制图员: import java.io.IOException; impo

一个正常的字数计算程序的输出是字,字数。 在reducer中,我们编写上下文(键、值)
但我想要文件中的总字数,例如,如果文件中有大量的单词,我希望输出为100个 1.在映射器中为每个单词的Reducer设置一个虚拟键。 2.由于Reducer将接收dummy作为键,并且值是可编辑的,因此您可以获得所有dummy记录的总和


:-)

我对MapReduce编程也很陌生,我把这个问题当作一种练习。我建议使用以下映射器和还原器:

制图员:

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;
导入java.util.StringTokenizer;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.NullWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Mapper;
公共类TotalWCMapper扩展了Mapper{
公共无效映射(对象键、文本值、上下文
)抛出IOException、InterruptedException{
StringTokenizer itr=新的StringTokenizer(value.toString());
IntWritable cnt=新的IntWritable(itr.countTokens());
write(nullwriteable.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);
  }
}
import java.io.IOException;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.NullWritable;
导入org.apache.hadoop.mapreduce.Reducer;
公共类TotalWCReducer扩展了Reducer{
public void reduce(可空写键、可写值、,
语境
)抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum+=val.get();
}
IntWritable结果=新的IntWritable(总和);
编写(键、结果);
}
}

对于每个文件中每行中的每个单词,将(键、值)设置为(文件名,1),并在reducer中总计1s

非常简单。将映射器的键设为文本类型,并将字数设为键,将可写(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));
    }
}
公共类Word\u
减速器{
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum++;
}
write(key,newintwriteable(sum));
}
}

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

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

在添加当前代码后,添加语言标记以帮助专家发现此问题也可能很有用。(虽然它可能只是一个复制品,但这似乎很常见。)输出为
100
100
?还可以获得每个单词的频率!!我今天意识到了!:-)你能通过一个例子来解释一下吗?因为只有一个减速器可以工作,这不是一个坏的解决方案吗?如果文件非常大,那么我们会淡化使用hadoop的目的。是否存在任何情况,其中每个减缩器都可以工作,并且所有减缩器在同一个位置聚合这些值。例如,通常每个函数都可以使用一个全局变量,mapreduce中是否也有每个reducer都可以使用的东西?