Cloudera 的这个视频教程很好地描述了如何通过 MapReduce 进行大规模连接,从大约 12 分钟开始。
以下是他列出的基本步骤,用于使用伪代码将文件 B 中的记录连接到密钥 K 上的文件 A 中的记录。如果这里有任何不清楚的地方,我建议您观看视频,因为他的解释比我做得更好。
在您的映射器中:
K from file A:
tag K to identify as Primary Key
emit <K, value of K>
K from file B:
tag K to identify as Foreign Key
emit <K, record>
编写一个将忽略 PK/FK 标记的 Sorter 和 Grouper,以便您的记录被发送到同一个 Reducer,无论它们是 PK 记录还是 FK 记录并被分组在一起。
编写一个比较器,它将比较 PK 和 FK 密钥并首先发送 PK。
这一步的结果将是所有具有相同键的记录将被发送到同一个 Reducer 并在同一组要归约的值中。带有 PK 标记的记录将首先出现,然后是 B 中需要加入的所有记录。现在,减速器:
value_of_PK = values[0] // First value is the value of your primary key
for value in values[1:]:
value.replace(FK,value_of_PK) // Replace the foreign key with the key's value
emit <key, value>
结果将是文件 B,所有出现的 K 都替换为文件 A 中的 K 值。您还可以扩展它以实现完全内部连接,或者将两个文件全部写出以直接进行数据库存储,但是一旦你得到这个工作,这些都是非常微不足道的修改。