在hadoop中mapreduce,如何统计一个文件email_log.txt文件内容中@字符的出现次数,并用键值对表示出来
时间: 2024-10-14 17:02:28 浏览: 74
在Hadoop MapReduce框架下,要统计一个文本文件中`@`字符的出现次数,你可以按照以下步骤设计Map和Reduce阶段:
1. **Mapper阶段**:
- 使用`TextInputFormat`读取文件,例如:`FileInputFormat.addInputPath(job, new Path("email_log.txt"))`
- 创建一个自定义的Mapper类,`Mapper extends Mapper<Object, Text, Key, Value>`,这里Key可以是IntWritable(0),Value可以是Text。
- 在`map()`函数里,逐行读取输入的文本,对于每行,分割成单词并检查是否包含`@`。如果是,就创建一个新的键值对`(1, word)`(假设我们想要计算每个`@`计数),如果不是,则忽略。
```java
private static class CountAtSymbolMapper extends Mapper<Object, Text, IntWritable, Text> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
for (String word : line.split("\\s+")) {
if (word.contains("@")) {
context.write(one, new Text(word));
}
}
}
}
```
2. **Reducer阶段**:
- 创建一个Reducer类,`Reducer<IntWritable, Text, IntWritable, Text>`, 用于累加每个`@`出现的次数。
- 在`reduce()`函数里,接收来自Mapper的所有`@`计数,将它们相加并作为新的键值对`(count, "@")`写入到结果。
```java
private static class SumReducer extends Reducer<IntWritable, Text, IntWritable, Text> {
private IntWritable result = new IntWritable();
@Override
protected void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (Text value : values) {
count += value.toString().equals("@") ? 1 : 0; // 如果value等于"@",计数加一
}
result.set(count);
context.write(key, new Text(result.toString()));
}
}
```
3. **Job配置**:
- 设置Mapper和Reducer类,以及适当的OutputFormat,如`TextOutputFormat`。
- 调用`job.setOutputKeyClass(IntWritable.class)` 和 `job.setOutputValueClass(Text.class)`设置输出键值对的类型。
- 运行任务:`job.waitForCompletion(true)`。
运行完成后,`key`字段将是总的`@`次数,`value`字段总是相同的字符串`"@"`。
阅读全文