Spark 上的 Levenshtein 距离算法
Posted
技术标签:
【中文标题】Spark 上的 Levenshtein 距离算法【英文标题】:Levenshtein distance algorithm on Spark 【发布时间】:2021-02-06 21:24:57 【问题描述】:我刚开始使用 Hadoop 生态系统,我遇到了一些问题,需要您的帮助。
我有两个 HDFS 文件,需要在第一个的一组列与第二个的另一组列之间执行 Levenshtein 距离。
每天都会执行此过程,数据量相当可观(第一个文件中的 150M 行,而第二个文件中的 11M 行)。
如果我能按照描述从 HDFS 读取我的两个文件执行 Levenshtein 距离(使用 Spark?)并将结果保存到第三个 HDFS 文件,我将不胜感激。
p>非常感谢您。
【问题讨论】:
【参考方案1】:我猜你有 csv 文件,所以你可以直接读取数据框:
val df1 = spark.read.option("header","true").csv("hdfs:///pathtoyourfile_1")
spark.sql.functions
模块包含 deflevenshtein(l: Column, r: Column): Column
函数,因此您需要作为参数传递 - 具有 String 类型的数据框列,如果要传递一组列,您可以使用 concat('col1,'col2,..)
函数连接多个列并传递他们到以前的功能。如果您有 2 个或更多数据帧,则必须将它们加入一个数据帧,然后执行距离计算。最后,您可以使用 df.write.csv("path")
将结果保存到 csv
【讨论】:
非常感谢您采用这种有趣的方法。如果一个 concat 列,Levenshtein 算法将如何受到影响?因为在第一个文件中我有一个包含客户姓名的单列(名字和姓氏按任何顺序),而在第二个文件中我需要连接名字和姓氏来构建相同的客户名称,但取决于 Levenshtein 算法将采取的顺序不同的分数?如果是,我该如何防止这种情况?提前谢谢! 如果您不知道哪个值是名字/姓氏,您可以连接它们并按字母顺序排序然后计算距离,例如split
将创建字符数组然后array_sort
将排序数组array_join
将创建单个排序字符串 array_join(array_sort(split('value,"")),"")
所以 "John|Smith" => "JShhimnot"
太棒了!非常感谢。最后一个问题,实际上我没有任何密钥来连接这两个文件,每个文件都来自不同的源系统,没有共同的密钥,目标是解析它们并尝试计算所有文件之间的相似度第一个文件中的条目与第二个文件中的所有行。如果没有公共密钥,我如何创建单个数据框?
您可以将 id 列添加到两个数据帧并使用它来加入它们 df.coalesce(1).withColumn("idx", monotonicallyIncreasingId())
你应该使用 coalesce(1)
来保持行的顺序,否则 spark 可能会混合行顺序,更多在这里 ***.com/questions/48209667/…
以上是关于Spark 上的 Levenshtein 距离算法的主要内容,如果未能解决你的问题,请参考以下文章
如何调整 Levenshtein 距离算法以将匹配限制为单个单词?