如何在Java Mapreduce上对具有多对多关系的两个表执行reduce侧联接



首先,我不确定这是否可能。如果可能的话,我仍然不确定这是否是正确的做法

我拥有的是:

  • HDFS上名为A和B的两个大型csv文件
  • A的列如下:a1、a2、a3、a4
  • B具有以下列:b1、b2、b3、b4、b5

我想要的是:

  • 如果a1=b1,则连接两个文件

我遇到的问题是:

  • 如果连接键上的两个文件之间存在多对多的关系,我如何在Java上使用Hadoop Mapreduce来执行此操作?

    如下图所示,对于a1=x,A有4个匹配行,对于b1=x,B有2个匹配行。因此,连接a1=b1=x上的两个表产生4*2=8行(组合),如最后一个表所示。使用reduce端联接,我无法做到这一点,因为这意味着要增加键和值对,这与MapReduce的本质背道而驰。

我怎么能做这样的事?

出现问题的原因是:

假设表A是:

a1  a2  a3          a4
x   1   somevalue   somevalue
x   2   somevalue   somevalue
x   3   somevalue   somevalue
x   4   somevalue   somevalue

假设表B是:

b1  b2  b3          b4          b5
x   i   somevalue   somevalue   somevalue
x   j   somevalue   somevalue   somevalue

在a1=b1上连接两个文件的结果:

a1  a2  b2
x   1   i
x   2   i
x   3   i
x   4   i
x   1   j
x   2   j
x   3   j
x   4   j

完全联接将始终为每个键生成M x N输出值。

注意,使用reduce侧联接,映射器发出的中间密钥对的数量仍然是N + M,并且是reducer进行笛卡尔乘积。所以这并没有错。由于您控制了减速器,因此您可以进行进一步的过滤并只输出您需要的内容。

最新更新