【问题标题】:Parallelized record combining - matching on multiple keys并行化记录组合 - 匹配多个键
【发布时间】:2010-12-26 05:24:06
【问题描述】:

我一直在研究使用 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 函数会为整个作业产生一个结果。

【问题讨论】:

    标签: parallel-processing distributed mapreduce


    【解决方案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: smith|^555, V: [(John Smith,555-555-5555),(Jane Smith,555-555-5555),(John Smith,555-555-1111))

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-19
        • 1970-01-01
        • 2013-08-07
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多