PySpark中用Levenshtein实现DataFrame与输入列表模糊匹配的问题
PySpark模糊匹配问题分析与解决方案
问题原因
你之前的代码逻辑有误:把多个关键词用|拼接成单个字符串后,和col1计算编辑距离。比如apple和apples|mango的编辑距离是6(需要删除6个字符才能匹配),远大于你设定的阈值5,所以返回空DataFrame。Levenshtein函数的作用是计算两个单一字符串的编辑距离,不支持直接和多个关键词批量比较。
最优实现方案
方法一:用array_exists批量检查(推荐)
利用array_exists遍历关键词数组,只要有一个关键词和col1的编辑距离小于阈值,就保留该行:
from pyspark.sql import functions as F input_array = ["apples", "mango"] result_df = df.filter( F.array_exists( F.array([F.lit(x) for x in input_array]), lambda keyword: F.levenshtein(F.col("col1"), keyword) < 5 ) ) result_df.show()
运行后会得到符合条件的两行:
+-----+-----+ | col1| col2| +-----+-----+ |apple| egg| |mango|bread| +-----+-----+
这里apple和apples的编辑距离是1,mango和mango的编辑距离是0,都满足<5的条件。
方法二:笛卡尔积+过滤(适合需查看匹配关键词的场景)
如果需要知道每行具体匹配了哪个关键词,或者关键词数量较多时,可以用这种方式:
from pyspark.sql import functions as F input_array = ["apples", "mango"] # 创建关键词表 keywords_df = spark.createDataFrame([(kw,) for kw in input_array], ["keyword"]) # 交叉关联后计算编辑距离,过滤后去重 result_df = df.crossJoin(keywords_df) \ .filter(F.levenshtein(F.col("col1"), F.col("keyword")) < 5) \ .select("col1", "col2", "keyword") \ .distinct() result_df.show()
运行结果会显示匹配的具体关键词:
+-----+-----+--------+ | col1| col2| keyword| +-----+-----+--------+ |apple| egg| apples| |mango|bread| mango| +-----+-----+--------+
内容的提问来源于stack exchange,提问作者curios
相关产品推荐
相关产品推荐

