我是hadoop的新手。我想提出一些我想出来的方法。
问题:
2个数据集:A和B.
两个数据集都代表歌曲:一些顶级属性,标题(1 .. ),表演者(1 .. )。
我需要根据标题和表演者使用相等或模糊算法(如levenshtein,jaccard,jaro-winkler等)匹配这些数据集。
数据集大小为:A = 20-30M,B~ = 1-6M。
所以这里有我提出的方法:
将数据集B(最小)加载到HDFS中。对数据集A(最大)使用mapreduce,其中:
map阶段:为A中的每条记录访问HDFS并拉出记录B进行匹配;
reduce phase:写入id对
以优化的形式将数据集A加载到distirubted缓存(即jboss缓存)中以加速搜索。对数据集B使用mapreduce,其中:
map阶段:为B查询分布式缓存中的每条记录进行匹配
reduce:写入id对
使用mapreduce连接两个数据集,其中
map阶段:从集合A中获取记录并设置B,匹配
减少阶段:相同的
(我对这一点很模糊。第一:加入将是具有万亿记录的笛卡尔积;第二:不确定hadoop如何跨群集平行化)
使用hive(我现在正在寻找如何插入将进行字符串匹配的自定义函数)
我正在寻找一个指针,这种方法可能是最好的候选人,也可能还有一些我看不到的其他方法。
答案 0 :(得分:9)
您可能会发现本文和代码很有用:
Efficient Parallel Set-Similarity Joins Using MapReduce
我个人在Cascading中实现了它并取得了良好的效果。不幸的是,代码过于特定于域而无法发布。
上述工作的目的是减少很可能类似的候选对的连接数,然后可以使用任何相关算法混合来直接比较候选对(在MR连接中)。一个好的副作用是可以在整个群集中均匀地执行此连接,而无需重复比较。
最终,这是在两个独立集合之间或同一集合中执行交叉连接的优化(第二种情况与第一种情况略有不同)。
披露:我是Cascading的作者
答案 1 :(得分:3)
看看
http://dbs.uni-leipzig.de/en/publication/learning_based_er_with_mr - >评估两个(大)输入集的笛卡尔prodzuct
然而,您应该尽量避免在笛卡尔积上进行成对相似度计算(Levenshtein等)。即使对于大型集群,即使对于中型数据集,也需要数小时到数天。
http://dbs.uni-leipzig.de/en/publication/lb_for_mr_based_er - >解释如何在确保均匀加载任务(单一和双源)的同时实现每个群集的成对比较的阻塞/聚类方法
答案 2 :(得分:1)
你可能想看看Jimmy Lin的这两篇论文:
您采用的方法取决于您使用的相似度量标准,但基于Lucene的方法可能适用于此处。您可能还想考虑分区数据的方法,以减少需要进行的比较次数。