25.1.26(Map Reduce3)

3. 案例分析:单词计数

下面我们通过一个简单的单词计数案例来深入理解 MapReduce 的工作流程。

假设我们有一个包含多篇文章的文本文件,我们想要统计每个单词在这些文章中出现的次数。

Map 阶段的代码如下:

 
复制代码
import java.io.IOException;
import java.util.StringTokenizer;
 
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
 
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
 
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
 
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 将输入的一行文本转换为字符串
        String line = value.toString();
        // 使用空格分割字符串,得到单词列表
        StringTokenizer tokenizer = new StringTokenizer(line);
        while (tokenizer.hasMoreTokens()) {
            // 获取每个单词,并将其作为键,出现次数1作为值输出
            word.set(tokenizer.nextToken());
            context.write(word, one);
        }
    }
}
复制代码

在上述代码中,WordCountMapper类继承自Mapper类,并重写了map方法。在map方法中,我们首先将输入的一行文本转换为字符串,然后使用StringTokenizer将其分割成单词。对于每个单词,我们将其包装成Text类型的对象作为键,将出现次数 1 包装成IntWritable类型的对象作为值,通过context.write方法输出。

Reduce 阶段的代码如下:

复制代码
import java.io.IOException;
 
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
 
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
 
    @Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        // 对相同单词的出现次数进行累加
        for (IntWritable value : values) {
            sum += value.get();
        }
        // 将单词和其总出现次数输出
        context.write(key, new IntWritable(sum));
    }
}
复制代码

在WordCount类的main方法中,我们首先创建了一个Configuration对象和一个Job对象。然后,我们通过job.setMapperClass和job.setReducerClass方法设置了 Map 阶段和 Reduce 阶段的处理类,通过job.setOutputKeyClass和job.setOutputValueClass方法设置了输出键值对的类型。接着,我们使用FileInputFormat.addInputPath和FileOutputFormat.setOutputPath方法设置了输入文件路径和输出文件路径。最后,通过job.waitForCompletion(true)提交任务并等待其完成。
 当我们在 Hadoop 集群上运行上述单词计数程序后,可以得到每个单词及其出现次数的统计结果。以下是一个简单的结果示例(部分展示):

单词 出现次数
"hadoop" 10
"bigdata" 8
"mapreduce" 6
posted @   a_true  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
历史上的今天:
2024-01-26 24.1.26
点击右上角即可分享
微信分享提示