优势:
1.mapjoin的并行度高
2.可以有效的避免数据倾斜
流程:
至少一个表读取一行数据,另一个表读取所有数据
使用setup先把表数据读取出来,读取到map集合中,key:关联字段 value:剩下字段
伪代码
public class MapJoin{
static class MyMapper extends Mapper{
@override
setup
//获取本地缓存文件
//读取一个表中的所有数据
//使用流存放到创建的map中
@override
map
String key = value.toString.spilt("::")[1];
//先读取另一个表,每读取一行就和map中的 数据进行关联
if(map.contains(key))
//进行关联
map.get(key)+split[0]+...
//进行写出
}
driver
//将制定文件加载到每一个运行计算任务的节点的缓存中
job.addCacheFile()
}
缺点:
1.需要一个表所有数据加载到缓存中,不能太大
2.仅仅适用于大小表,小小表关联
大大表的关联:
1.reducejoin可以解决关联问题,但不完美
2.将其中一个大表进行切分,成多个小表再进行关联