一、Reduce Join
1.概述
- Map端的工作:打标签以区别不同来源的记录,然后使用连接字段作为key,其余部分和新加的标签作为value,最后输出到Reduce端
- Reduce端的工作:来自Map端的数据具有相同的连接字段key,根据标签将来自不同文件的记录分开为两份或多份,在将这多份记录进行合并
2.具体实现
- 按照读取数据的特点选择InputFormat
在setUp()方法内获取文件名
@Override
protected void setup(Context context) throws IOException, InterruptedException {
FileSplit fileSplit = (FileSplit) context.getInputSplit();
fileName = fileSplit.getPath().getName();
}
将获取到的数据中除连接字段外的字段封装进Bean对象,并添加标记位(文件名)
- 将连接字段作为key,Bean对象作为value输出
- reduce阶段将来自不同文件的Bean对象进行拆分
- 合并数据并输出
二、Map Join
1.概述
加载缓存数据
job.addCacheFile(new URI("file://path/path/file.txt"))
设置reduce数量为0
- setUp方法操作缓存
- 获取缓存文件
- 循环读缓存的每一行
- 分割
- 缓存数据到集合(通常用hashmap,连接字段做key)
- map方法合并
- 合并(根据连接字段查找对象)
- 输出