案例要求
统计输入路径内每个单词在不同文件中的出现次数。
输入文件示例
// a.txt
atguigu pingping
atguigu ss
atguigu ss
// b.txt
atguigu pingping
atguigu pingping
atguigu ss
// c.txt
atguigu ss
atguigu pingping
输出结果示例
// part-r-00000
atguigu c.txt: 2, b.txt: 3, a.txt: 3
pingping c.txt: 1, b.txt: 2, a.txt: 1
ss c.txt: 1, b.txt: 1, a.txt: 2
解答思路
对于本案例,将其分为两步比较合适。
首先,将单词和所在文件所为key,统计出不同单词和不同文件的出现次数。
输出示例:
atguigu--a.txt 3
atguigu--b.txt 3
atguigu--c.txt 2
pingping--a.txt 1
pingping--b.txt 2
pingping--c.txt 1
ss--a.txt 2
ss--b.txt 1
ss--c.txt 1
其次,再将单词作为key,剩下的合并为value,就可以完成案例要求。本案例涉及到多个job串联,需要在驱动类中加入JobControl进行控制,并且需要设置 job之间的依赖关系。
代码实现
第一步
WordCountAtFileMapper.java
package com.tony.mr.word_count_plus;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import java.io.IOException;
/**
* @author tony
* @create 2020-07-27 11:50
*/
public class WordCountAtFileMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text wordAndFile = new Text();
private IntWritable One = new IntWritable(1);
private String fileName;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
InputSplit inputSplit = context.getInputSplit();
FileSplit fileSplit = (FileSplit) inputSplit;
fileName = fileSplit.getPath().getName();
}
@Override
protected void map