首先,先说一下当前了解到的一个适用MapJoin的场景吧:
比如我们此时手中有两个表需要我们进行处理,但是呢一个很大,一个很小。那么这个时候我们比较适合使用MapJoin进行处理。
那么我们具体是怎么实现MapJoin的这个操作的呢?:
我们可以在map端对小的那个表先进行缓存,提前在map端将数据进行处理,那么这么做有什么好处呢,我们可以减少reduce端的压力、加快数据传输的速度、尽可能的减少reduce端出现数据倾斜(暂时个人理解为:因为每个map端的大小是可以设置的默认是128M,在map端进行处理应该不会因为某一个键特别多导致数据倾斜的发生,而且每个mapTask都是并行的。呃……没得到确认暂时先这么理解,有问题会修改。)
具体实现:
在map的setup阶段对小的文件进行缓存到:
当然在驱动类之中还需要加上job.addCacheFile(new URI(“file:///D:/Hadoop/11_input/tablecache/pd.txt”));
小表样例:
然后在map阶段将大表的文件进行读取,按照需求将大表中的数据和从HashMap中提取出的数据合并输出。