我是hadoop的新手.我想提出一些我想出来的方法.
问题:
2个数据集:A和B.
两个数据集代表歌曲:一些顶级属性,标题(1 .. ),表演者(1 ..).
我需要使用基于标题和表演者的相等或模糊算法(例如levenshtein,jaccard,jaro-winkler等)来匹配这些数据集.
数据集大小为:A = 20-30M,B~ = 1-6M.
所以这里有我提出的方法:
将数据集B(最小)加载到HDFS中.对数据集A(最大)使用mapreduce,其中:
map phase:对于A访问HDFS中的每条记录,并拉出记录B进行匹配;
reduce phase:写入id对
将数据集A加载到优化形式的distirubted缓存(即jboss缓存)中以加速搜索.对数据集B使用mapreduce,其中:
map phase:对于B查询中的每个记录,用于匹配的分布式缓存
reduce:写入id对
使用mapreduce连接两个数据集,其中
map阶段:从集合A和集合B获取记录,匹配
减少阶段:相同
(我对第一个模糊不清.第一个:连接将是具有万亿个记录的笛卡尔积;第二个:不确定hadoop如何跨群集平行化)
使用配置单元(我正在寻找现在试图找出如何插入将进行字符串匹配的自定义函数)
我正在寻找一个指针,这种方法将是最好的候选人,或者也许还有一些我看不到的方法.
您可能会发现本文和代码很有用:
使用MapReduce进行高效并行集相似性连接
我个人在Cascading中实现了它,效果很好.不幸的是,代码过于特定于域而无法发布.
上述工作的要点是减少与非常可能相似的候选对的连接数,然后可以使用任何相关算法混合来直接比较候选对(在MR连接中).一个好的副作用是可以在整个群集中均匀地执行此连接,而无需重复比较.
最终,这是在两个独立集之间或在同一集合内执行交叉连接的优化(第二种情况与第一种情况略有不同).
披露:我是Cascading的作者