如何使用两个具有多对多关系的表来执行减少Java Mapreduce上的连接?

时间:2014-08-29 21:00:23

标签: java hadoop mapreduce

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

我拥有的是:

  • 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

1 个答案:

答案 0 :(得分:0)

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

请注意,使用reduce侧连接时,映射器发出的中间键对的数量仍为N + M,并且它是执行笛卡尔积的缩减器。所以没有错。由于您控制了减速器,因此您可以进一步过滤并仅输出所需的内容。