Mapreduce/Hadoop中两个数据集的连接
有人知道如何在Hadoop中实现两个数据集之间的自然连接操作吗 更具体地说,我需要做的是: 我有两组数据:Mapreduce/Hadoop中两个数据集的连接,hadoop,join,mapreduce,distributed,Hadoop,Join,Mapreduce,Distributed,有人知道如何在Hadoop中实现两个数据集之间的自然连接操作吗 更具体地说,我需要做的是: 我有两组数据: 存储为(平铺编号,点id:point\u info)的点信息,这是一个1:n键值对。这意味着对于每个磁贴编号,可能有几个点id:point\u info 行信息存储为(tile\u编号,Line\u id:Line\u信息),这也是一个1:m键值对,对于每个tile\u编号,可能有多个Line\u id:Line\u信息 正如您所看到的,两个数据集之间的tile_编号是相同的。现在我真正需
为了澄清,这里有一个例子: 对于点对:
(tile0, point0)
(tile0, point1)
(tile1, point1)
(tile1, point2)
对于线对:
(tile0, line0)
(tile0, line1)
(tile1, line2)
(tile1, line3)
我想要的是:
对于磁贴0:
(tile0, point0:line0)
(tile0, point0:line1)
(tile0, point1:line0)
(tile0, point1:line1)
对于地砖1:
(tile1, point1:line2)
(tile1, point1:line3)
(tile1, point2:line2)
(tile1, point2:line3)
使用将标题输出为关键帧、点/线输出为值的映射器。必须区分点输出值和线输出值。例如,您可以使用一个特殊字符(即使二进制方法会更好) 因此,贴图输出将类似于:
tile0, _point0
tile1, _point0
tile2, _point1
...
tileX, *lineL
tileY, *lineK
...
然后,在减速器处,您的输入将具有以下结构:
tileX, [*lineK, ... , _pointP, ...., *lineM, ..., _pointR]
你必须把点和线分开,做一个叉积,然后输出每对叉积,如下所示:
tileX (lineK, pointP)
tileX (lineK, pointR)
...
如果您已经可以轻松区分点值和线值(取决于您的应用程序规范),则不需要特殊字符(*,\)
关于在减速器中必须进行的叉积:
首先遍历整个值列表,将它们分为两个列表:
List<String> points;
List<String> lines;
所以这里基本上有两个选择:减少边连接或映射边连接 这里您的组密钥是“平铺”。在单个减速器中,您将获得点对和线对的所有输出。但必须在阵列中缓存点对或线对。如果其中一对(点或线)非常大,都无法放入单个组键(每个唯一磁贴)的临时阵列内存中,则此方法将不适用于您。请记住您不必在内存中同时保留单个组键(“平铺”)的两个键对,一个就足够了
如果单个组密钥的两个密钥对都较大,则必须尝试映射侧连接。但它有一些特殊的要求。但是,您可以通过一些map/reduce作业对数据进行预处理来满足这些要求,这些作业为两个数据运行相同数量的reducer 太好了。但是我应该如何做reduce部分中的叉积呢?很好,但是只有当你能将所有的点/线放入内存,以便将它们存储在上面提到的两个列表中时,这才有效。恐怕我的大型数据集并非如此:(这篇文章很老,但因为我有一个问题非常类似于这篇文章,所以在这里发布。有人能在这里提供代码示例,说明如何以map/reduce格式执行此操作。我正在尝试理解和学习此内容。感谢advance@reza您是否已经为大型数据集找到了上述解决方案??
tile(current key), element_of_the_resulting_cross_product_list