一个正常的单词计数程序,输出为单词,单词数。在reducer中,我们编写上下文(键、值)但我希望文件中的单词总数,例如,如果文件中有一百个单词,我希望输出为一百个
它可以使用计数器来实现。context对象有权访问这些计数器。计数器在每个节点递增,然后最终聚合。
我想以下内容应该有效:1.在Mapper中为每个单词设置一个Reducer伪键。2.由于Reducer将接收dummy作为键,并且值将是Iterable,因此您可以获得所有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;
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);
}
}
对于每个文件中每行中的每个单词,将(键,值)设为(filename,1),并在减缩中总共加1
它非常简单。将映射器的键设为Text类型,并发出Numberofwords作为键,发出Intwritible(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));
}
}
它将产生您需要的输出。如果这个解决方案适合您的情况,请接受我的回答。