有谁知道如何在Hadoop中实现两个数据集之间的Natural-Join操作?
更具体地说,这是我真正需要做的:
我有两组数据:
存储为 (tile_number, point_id:point_info) 的点信息,这是一个 1:n 键值对。这意味着对于每个 tile_number,可能有多个 point_id:point_info
存储为 (tile_number, line_id:line_info) 的行信息,这又是一个 1:m 键值对,对于每个 tile_number,可能有多个 line_id:line_info
如您所见,两个数据集之间的 tile_numbers 相同。现在我真正需要的是根据每个 tile_number 加入这两个数据集。换句话说,对于每个 tile_number,我们有 n 个 point_id:point_info 和 m line_id:line_info。我想要做的是将所有 point_id:point_info 对与每个 tile_number 的所有 line_id:line_info 对连接起来
为了清楚起见,这里有一个例子:
对于点对:
(tile0, point0)
(tile0, point1)
(tile1, point1)
(tile1, point2)
对于线对:
(tile0, line0)
(tile0, line1)
(tile1, line2)
(tile1, line3)
我想要的是:
对于图 block 0:
(tile0, point0:line0)
(tile0, point0:line1)
(tile0, point1:line0)
(tile0, point1:line1)
对于图 block 1:
(tile1, point1:line2)
(tile1, point1:line3)
(tile1, point2:line2)
(tile1, point2:line3)
最佳答案
使用映射器将标题输出为键,将点/线输出为值。您必须区分点输出值和线输出值。例如,您可以使用特殊字符(即使二进制方法会好得多)。
因此 map 输出将类似于:
tile0, _point0
tile1, _point0
tile2, _point1
...
tileX, *lineL
tileY, *lineK
...
然后,在 reducer 中,您的输入将具有以下结构:
tileX, [*lineK, ... , _pointP, ...., *lineM, ..., _pointR]
并且您必须将值分开点和线,进行叉积并输出每对叉积,如下所示:
tileX (lineK, pointP)
tileX (lineK, pointR)
...
如果您已经可以轻松区分点值和线值(取决于您的应用规范),则不需要特殊字符 (*,_)
关于你必须在 reducer 中做的叉积: 您首先遍历整个值列表,将它们分成 2 个列表:
List<String> points;
List<String> lines;
然后使用 2 个嵌套的 for 循环进行叉积。 然后遍历结果列表并为每个元素输出:
tile(current key), element_of_the_resulting_cross_product_list
关于hadoop - 在 Mapreduce/Hadoop 中加入两个数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803450/