前提:两个表进行inner join
1、map side join
效率比reduce side join高,不会产生shuffle
第一步:使用DistributeCache.addCacheFile将一个文件分布式的缓存到每一台机器本地,这一步要在job启动之前设置,也就是在启动函数内job 设置之前(main函数里)。
第二步:使用getLocalCacheFiles获取文件,这一步是在setUp方法里面,然后获取到每一行数据,将每一行数据使用局部变量HashMap存储
第三步:在Mapper方法里面获取到hdfs上的一个文件,读取内容,join的on条件即为hashmap的key以及读取文件的某个字段,然后做逻辑判断,最后context.write将数据写出,如果输出多个字段,使用javabean封装即可,但是javabean需要实现WritableCompare进行序列化输入输出。
2.reduce side join
会产生shuffle,效率比较慢。
第一步mapper函数:使用mapper函数读取所有文件,每个文件有不同之处,比如字段个数不一样等,根据这些可以去设置每行内容所属的文件,获取到每行之后将每行内容set到javabean中,使用context.write(NullWritable.get(),JavaBean)输出
第二步reduce:接收到数据之后按照文件标识获取内容,可以使用equals判断on条件,然后进行数据封装输出即可。