使用mapreduce写一个词频统计,并给出每行代码的注释
时间: 2024-03-13 20:45:46 浏览: 68
好的,下面是使用 MapReduce 写词频统计的代码及注释:
```java
// Map 阶段
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1); // 定义一个 IntWritable 类型的常量 one,值为 1
private Text word = new Text(); // 定义一个 Text 类型的变量 word
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
String line = value.toString(); // 将输入的每一行数据转为字符串
StringTokenizer tokenizer = new StringTokenizer(line); // 将字符串按照空格分隔成单词
while (tokenizer.hasMoreTokens()){ // 遍历每个单词
word.set(tokenizer.nextToken()); // 将当前单词存入变量 word 中
context.write(word, one); // 输出 <word, 1>
}
}
}
// Reduce 阶段
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable>{
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
int sum = 0; // 定义一个整型变量 sum,初始值为 0
for (IntWritable val : values){ // 遍历每个单词的出现次数
sum += val.get(); // 将每个单词的出现次数累加到 sum 中
}
context.write(key, new IntWritable(sum)); // 输出 <word, sum>
}
}
// Driver 阶段
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration(); // 创建一个 Configuration 对象
Job job = Job.getInstance(conf, "word count"); // 创建一个 Job 对象,设置作业名称为 "word count"
job.setJarByClass(WordCount.class); // 设置作业运行的类
job.setMapperClass(Map.class); // 设置 Map 类
job.setCombinerClass(Reduce.class); // 设置 Combine 类
job.setReducerClass(Reduce.class); // 设置 Reduce 类
job.setOutputKeyClass(Text.class); // 设置输出键的类型
job.setOutputValueClass(IntWritable.class); // 设置输出值的类型
FileInputFormat.addInputPath(job, new Path(args[0])); // 设置输入路径
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 设置输出路径
System.exit(job.waitForCompletion(true) ? 0 : 1); // 提交作业并等待完成
}
```
以上代码实现了词频统计的功能,注释中对每个关键部分进行了说明。其中,MapReduce 的 Map 阶段将每个单词映射为键值对 <word, 1>,而 Reduce 阶段将相同单词的出现次数累加起来,输出 <word, sum>。主函数中通过设置作业的参数和路径来启动 MapReduce 作业的执行。
阅读全文