0

我一直在研究使用 MapReduce 构建一个并行化的记录组合系统。语言无关紧要,我可以使用预先存在的库,例如 Hadoop,或者在必要时构建自己的库,我并不担心。

然而,我一直遇到的问题是我需要在多个条件上匹配记录。例如:我可能需要根据人名人的电话号码匹配记录,但不一定是人名电话号码。

例如,给定每条记录的以下键:

  1. “约翰·史密斯”和“555-555-5555”
  2. “简·史密斯”和“555-555-5555”
  3. “约翰史密斯”和“555-555-1111”

我希望系统获取所有三个记录,找出它们在其中一个键上匹配,并将它们组合成一个包含两个名称(“John Smith”和“Jane Smith”)以及两个电话号码的组合记录(“555-555-5555”和“555-555-1111”)。

这是我可以使用 MapReduce 完成的事情吗?如果是这样,我将如何匹配 Map 函数生成的键,以便所有匹配的记录都可以传递到 Reduce 函数中。*或者,有没有不同/更好的方法可以做到这一点?我唯一真正的要求是我需要它并行化。

[*] 请注意:我假设 Reduce 函数的使用方式是,每次调用 Reduce 函数都会产生一个组合记录,而不是 Reduce 函数会为整个作业产生一个结果。

4

2 回答 2

1

您绝对可以在 map/reduce 范例中做到这一点。

假设您要匹配包含“smith”或以“555”开头的电话号码的任何内容。例如,您可以将搜索字符串规范化为“smith|^555”。在 Map 阶段,您将执行以下操作:

  • 约翰·史密斯 / 555-555-5555 K: smith|^555, V = (约翰·史密斯,555-555-5555)
  • Jane Doe / 555-555-5555 K: smith|^555, V = (Jane Doe,555-555-5555)
  • 约翰·史密斯 / 555-555-1111 K: smith|^555, V = (约翰·史密斯,555-555-1111)

由于您给了它们所有相同的密钥(“smith|^555”),它们都将被移交给同一个 reducer 实例,该实例现在将作为输入:

K: 史密斯|^555, V: [(约翰·史密斯,555-555-5555),(简·史密斯,555-555-5555),(约翰·史密斯,555-555-1111))

现在,在您的 reducer 步骤中,您可以为名称实例化一个哈希集,为数字实例化另一个哈希集,然后在处理完值数组后,输出名称哈希集中的所有键和数字哈希集中的所有键。

于 2010-01-07T02:18:13.233 回答
0

我不认为 Map 在这里有用,因为您不能真正为每条记录创建一个有意义的键来帮助识别记录的分组。

也不可能使用 Reduce 来实现这一点。考虑您自己给出的示例......如果您查询“Jane Smith”,您无法检测到第一条记录与查询相关,因此将忽略它​​。实际上,您最终可以将名称和数字链接在一起,直到您获得文件中的每条记录。获取所有匹配项的唯一方法是迭代扫描列表,直到您停止查找新链接。

不过,这很容易并行化,您可以在一些线程之间共享记录,每个线程都可以搜索自己的记录以查找新链接。我建议将这些集合视为数据环,以便您可以使用最新信息记录您正在搜索的点,并且您知道一旦所有线程都完成了完整的循环,您就完成了。

于 2009-12-13T20:05:34.493 回答