我一直在寻找使用MapReduce构建并行化记录组合系统。语言并不重要,我可以使用Hadoop之类的预先存在的库,或者在必要时构建我自己的库,我并不担心。
然而,我遇到的问题是我需要在多个条件上匹配记录。例如:我可能需要根据此人的姓名或匹配记录,但不一定是该人的姓名和电话号码。
例如,给出每条记录的以下键:
我希望系统获取所有三个记录,找出它们在其中一个键上匹配,并将它们组合成一个具有两个名称('John Smith'和'Jane Smith')的组合记录以及两个电话号码('555-555-5555'和'555-555-1111')。
这是我可以用MapReduce完成的吗?如果是这样,我将如何匹配Map函数生成的键,以便所有匹配的记录都可以传递到Reduce函数。*或者,是否有不同/更好的方法可以做到这一点?我唯一真正的要求是我需要并行化。
[*]请注意:我假设Reduce函数可以这样使用,即每次调用Reduce函数都会生成一个组合记录,而不是Reduce函数为整个作业生成单个结果。
答案 0 :(得分:1)
你绝对可以在map / reduce范例中这样做。
假设您在包含“史密斯”或以“555”开头的电话号码的任何内容上进行匹配。例如,您可以将搜索字符串规范化为“smith | ^ 555”。在Map阶段,你可以这样做:
既然你已经给了他们所有相同的密钥(“smith | ^ 555”),他们将全部交给相同的reducer实例,现在可以作为输入:
K:史密斯| ^ 555,V:[(John Smith,555-555-5555),(Jane Smith,555-555-5555),(John Smith,555-555-1111))
现在,在reducer步骤中,您可以实例化名称的哈希集和数字的另一个哈希集,然后在完成处理值数组时,输出名称哈希集中的所有键和数字哈希集中的所有键。
答案 1 :(得分:0)
我不认为Map在这里有用,因为你不能真正为每个记录创建一个有意义的密钥,以帮助识别记录分组。
使用Reduce也无法实现这一点。考虑一下您自己给出的示例...如果查询“Jane Smith”,则无法检测到第一条记录与查询相关,因此会忽略它。实际上,您最终可能会将名称和数字链接在一起,直到您获得文件中的所有记录为止。获取所有匹配的唯一方法是迭代扫描列表,直到您停止查找新链接。
这很容易并行化,但您可以在一些线程中分享记录,每个线程都可以搜索自己的记录以获取新链接。我建议将这些集合视为数据环,以便您可以使用最新信息记录您正在搜索的点,并且您知道在所有线程完成一个完整循环后您就完成了。