hadoop - 在 Mapreduce/Hadoop 中加入两个数据集

标签 hadoop join mapreduce distributed

有谁知道如何在Hadoop中实现两个数据集之间的Natural-Join操作?

更具体地说,这是我真正需要做的:

我有两组数据:

  1. 存储为 (tile_number, point_id:point_info) 的点信息,这是一个 1:n 键值对。这意味着对于每个 tile_number,可能有多个 point_id:point_info

  2. 存储为 (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/

相关文章:

hadoop - HBase UI不显示任何区域服务器

java - 如何使用 java 读取 spark 中的 xls 和 xlsx 文件?

hadoop - 基于 HBase 的 Hive 与基于 HDFS 的 Hive

python - 如何在Hadoop中迭代MapReduce? (lang:python)

hadoop - 将复杂的存储过程迁移到Hive/Hbase或任何其他hadoop生态系统

mysql - 在另一个查询中使用一个查询的结果

sql - 您可以在联接期间更改 where 子句中的列值吗?

php - 显示一个表的所有结果以及在哪个区有多少

python - 有没有办法在 Hadoop 管理 Web 界面中指定 mrjob 的作业标题?

hadoop - Hadoop 中的 DBSCAN