假设表A跟表B进行join操作,连接条件是A.id=B.id
方法一:
过程简述
- map阶段:
- 遍历A表的每行记录,提取出id字段作为key,这一整行记录,加上一个区分AB表的字段,作为value输出到reduce阶段去
- 对B表也进行如此操作
- reduce阶段:
- 这样reduce收到的数据以id作为key的列表,这个列表有表A的数据也有表B的数据,只需要遍历该列表所有的记录进行A表和B表关联即可
优点
- 通用,不管是多大规模的表都可进行操作
- 多表关联同样适用
缺点
- 由于reduce阶段是以id为key,不可避免会有倾斜的问题
- 只能进行等号连接,不能进行不等号连接
方法二:
方法二建立在有一张表是小表的情况下
过程简述
- map阶段:
- 将小表分发到所有的map,map直接加载小表进内存,以id做key初始化一个map
- 遍历大表所有的记录,通过id(假设id=1)查询内存中小表id等于1的记录,进行关联操作
- reduce阶段:(并没有reduce阶段)
优点
- 没有倾斜问题
- 连接条件可以是任意条件,可以有大于号,小于号,不等号等等
缺点
方法三
方法二是将小表数据放进内存初始化成一个map,方法三就是引用第三方数据库,将其中一张表的数据放进redis或hbase,在map阶段遍历另一张表进行关联操作