You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:28:17