【问题标题】:Similarity join using Hadoop使用 Hadoop 的相似性连接
【发布时间】:2010-10-29 16:23:20
【问题描述】:

我是 hadoop 新手。我想和你一起运行一些我想出的方法。

问题:
2 个数据集:A 和 B。
两个数据集都代表歌曲:一些顶级属性、标题 (1..)、表演者 (1..)。
我需要根据标题和表演者使用相等或模糊算法(例如 levenshtein、jaccard、jaro-winkler 等)来匹配这些数据集。
数据集大小为:A=20-30M,B~=1-6M。

所以这里有一些我想出的方法:

  1. 将数据集 B(最小)加载到 HDFS。对数据集 A(biggest) 使用 mapreduce,其中:
    map阶段:对A中的每条记录访问HDFS并拉取记录B进行匹配;
    reduce 阶段:写入 id 对

  2. 以优化的形式将数据集 A 加载到分布式缓存(即 jboss 缓存)中以加快搜索速度。对数据集 B 使用 mapreduce,其中:
    map阶段:针对B查询分布式缓存中的每条记录进行匹配
    reduce : 写入 id 对

  3. 使用 mapreduce 连接两个数据集,其中
    映射阶段:从集合 A 和集合 B 获取记录,进行匹配
    减少阶段:相同
    (我对此很模糊。第一个:join 将是具有数万亿条记录的笛卡尔积;第二个:不确定 hadoop 如何跨集群并行化)

  4. 使用 hive(我现在正在研究如何插入自定义函数来进行字符串匹配)

我正在寻找指针,哪种方法是最佳候选方法,或者可能还有其他一些我看不到的方法。

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    您可能会发现本文和代码很有用:

    Efficient Parallel Set-Similarity Joins Using MapReduce

    我亲自在Cascading 中实现了它,效果很好。不幸的是,代码太特定于域而无法发布。

    上述工作的重点是减少很可能相似的候选对的连接数量,然后可以使用任何相关算法的混合物直接比较候选对(在 MR 连接中)。一个好的副作用是可以在整个集群中均匀地执行此连接,而无需重复比较。

    最终,这是对在两个独立集合之间或同一集合内执行交叉连接的优化(第二种情况的实现与第一种略有不同)。

    披露:我是 Cascading 的作者

    【讨论】:

    • 感谢您的回复。该链接非常有用。
    【解决方案2】:

    看看

    1. http://dbs.uni-leipzig.de/en/publication/learning_based_er_with_mr -> 评估两个(大)输入集的笛卡尔积

      但是,您应该尽量避免对笛卡尔积进行成对相似度计算(Levenshtein 等)。即使是大型集群,即使是中型数据集也需要数小时到数天。

    2. http://dbs.uni-leipzig.de/en/publication/lb_for_mr_based_er -> 解释了如何在确保均匀加载任务(单源和双源)的同时实现对每个集群进行成对比较的 Blocking/Clustering 方法

    【讨论】:

      【解决方案3】:

      您可能想看看 Jimmy Lin 的这两篇论文:

      您采用的方法将取决于您使用哪种相似度指标,但基于 Lucene 的方法可能适用于此。您可能还想考虑如何对数据进行分区以减少需要进行的比较次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-02
        • 2020-07-19
        • 2016-08-03
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多