Hadoop中两表JOIN的处理方法

参考

Hadoop中两表JOIN的处理方法

小结

1,reduce side join

在reduce阶段join。

map阶段标记数据来自哪个文件,比如来自file1标记tag=1,来自file2标记tag=2。

reduce阶段把key相同的file1的数据和file2的数据通过笛卡尔乘积join在一起。

个人理解:举个例子
file1 有{1:'a', 2:'b', 3:'c'}
file2 有{1:'A', 2:'B'}

可以join成{1:['a','A'], 2:['b', 'B']}

2,map side join

在map阶段join。

适用于情况:两个待连接表中,有一个表非常大,而另一个表非常小。以至于小的表可以放进去内存中。

那么就把小表在每个map task中复制一份,然后只扫描大表,对大表中的每一条记录,看看key是否存在于小表中,将匹配的key的数据join起来输出。

3,semijoin半连接

这个是要改进reduce side join。建立一个小表file3,把file1的所有要参加join的数据的key复制进去,然后把file3复制到每一个map task中去,然后找出不在file2中的key,过滤掉这些数据后再进行reduce side join,减少跨机器数据传输。

个人理解:举个例子
file1 有{1:'a', 2:'b', 3:'c'}
file2 有{1:'A', 2:'B'}

建立一个小表file3,所有要参加join的数据的key复制进去也就是
[1, 2, 3],然后发现file2中没有key=3的,所以可以过滤掉key=3的数据后再进行reduce join,来减少跨机器数据传输。

4,加入bloom filter

继续改进3。引入bloom filter。这种数据结构的特点是,存在false positive。如果使用它判断一个元素在集合中(positive),那其实有可能不在(false)。但是如果使用它判断一个元素不在集合中,那这个元素就真的不在这个集合中了。(没有false negative)

利用这个特点可以怎么改进3呢?在3中的file3我们可以用bloom filter来实现,要判断file2的key是否存在于file3中的时候直接使用bloom filter来判断。这样,如果判断说file2的某个key存在于file3中(positive),但是实际不在(false),那也无所谓,只是少过滤了一些key而已,还是可以正确地join。但是bloom filter可以保证没有false negative,如果判断file2的某个key不在file3中,那就真的不在file3中,这样可以保证join的正确性(不会少join了一些数据)。

5,二次排序

参考
http://www.cnblogs.com/xuxm2007/archive/2011/09/03/2165805.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值