Parallel processing 多键并行记录合并匹配

Parallel processing 多键并行记录合并匹配,parallel-processing,distributed,mapreduce,Parallel Processing,Distributed,Mapreduce,我一直在考虑使用MapReduce构建一个并行记录合并系统。语言不重要,我可以使用Hadoop等已有的库,或者在必要时构建自己的库,我不担心这一点 然而,我一直遇到的问题是,我需要根据多个条件匹配记录。例如:我可能需要根据姓名或电话号码匹配记录,但不一定是姓名和电话号码 例如,为每个记录提供以下键: “约翰·史密斯”和“555-555-5555” “简·史密斯”和“555-555-5555” “约翰·史密斯”和“555-555-1111” 我希望系统获取所有三条记录,找出它们在其中一个键上匹配,

我一直在考虑使用MapReduce构建一个并行记录合并系统。语言不重要,我可以使用Hadoop等已有的库,或者在必要时构建自己的库,我不担心这一点

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

例如,为每个记录提供以下键:

  • “约翰·史密斯”和“555-555-5555”
  • “简·史密斯”和“555-555-5555”
  • “约翰·史密斯”和“555-555-1111”
  • 我希望系统获取所有三条记录,找出它们在其中一个键上匹配,然后将它们组合成一个组合记录,其中既有姓名('John Smith'和'Jane Smith'),也有电话号码('555-555-5555'和'555-555-1111')

    这是我使用MapReduce可以实现的吗?如果是这样,我将如何匹配Map函数生成的键,以便将所有匹配的记录传递到Reduce函数。*或者,是否有其他/更好的方法?我唯一真正的要求是我需要它并行化


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

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

    使用Reduce也不可能实现此功能。想想你自己给的例子…如果查询“Jane Smith”,则无法检测到第一条记录与查询相关,因此将忽略它。事实上,你可以把名字和数字链接在一起,直到你得到文件中的每一条记录。获取所有匹配项的唯一方法是迭代扫描列表,直到您停止查找新链接


    这是非常容易并行化的,你只需要在一些线程之间共享记录,每个线程都可以搜索自己的记录来寻找新的链接。我建议将这些集合视为数据环,这样您就可以使用最新的信息记录您正在搜索的点,并且在所有线程完成一个完整的循环后,您就知道您已经完成了。

    您完全可以在map/reduce范例中这样做

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

    • 约翰·史密斯/555-555-5555→ K:smith ^^555,V=(约翰·史密斯,555-555-5555)
    • 无名氏/555-555-5555→ K:smith |^555,V=(无名氏,555-555-5555)
    • 约翰·史密斯/555-555-1111→ K:smith ^^555,V=(约翰·史密斯,555-555-1111)
    由于您为它们提供了相同的密钥(“smith | ^555”),因此它们都将被传递到同一个reducer实例,该实例现在将作为输入获取:

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

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