首先,我不确定这是否可能。如果可能的话,我仍然不确定这是否是正确的做法
我拥有的是:
- 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进行笛卡尔乘积。所以这并没有错。由于您控制了减速器,因此您可以进行进一步的过滤并只输出您需要的内容。