Levenshtein on dataframe 列和输入列表

Levenshtein on dataframe column and input list

提问人:curios 提问时间:4/24/2023 更新时间:4/24/2023 访问量:78

问:

pyspark 的新手,我需要做模糊匹配。发现 levenhenstein 是一个可以做到这一点的原生函数。我有一个这样的数据帧:

+----------------+----------------+ |col1|col2|
+----------------+----------------+ |苹果|鸡蛋|
|芒果|面包|
|香蕉|黄油|

以及像 [“apples”,“mango”] 这样的输入列表。我需要从 col1 和输入列表中获取所有(模糊)匹配项。

我正在使用以下代码:

input_array=["apples","mango"]
keyword_array=array([lit(x) for x in input_array])
keyword_string = array_join(keyword_array, "|")
result_df = df.filter(levenshtein("col1", keyword_string)<5)

levenshtein 只能同时具有列参数,或者第二个参数可以是字符串。此代码不会给出任何错误,但也不会给出任何结果(result_df.show() 显示空数据帧)。谁能让我知道我在这方面做错了什么,或者实现这一目标的最佳方法?

Pyspark levenshtein-距离 模糊比较

评论


答:

0赞 notNull 4/24/2023 #1

您没有获得任何符合 . 的行。filter condition

Example:

df = spark.createDataFrame([('apple','egg'),('mango','bread'),('banana','butter')],['col1','col2'])
input_array=["apples","mango"]

keyword_array=array([lit(x) for x in input_array])
keyword_string = array_join(keyword_array, "|")
df.withColumn("keyword_tmp",keyword_string).\
withColumn('distance',levenshtein("col1", "tmp")).show(10,False)
#+------+------+------------+--------+
#|col1  |col2  |keyword_tmp |distance|
#+------+------+------------+--------+
#|apple |egg   |apples|mango|7       |
#|mango |bread |apples|mango|7       |
#|banana|butter|apples|mango|10      |
#+------+------+------------+--------+

如上所示,显示距离,但过滤条件的距离为 。7<5

更改筛选条件以获取结果。result_df = df.filter(levenshtein("col1", keyword_string)<8)

评论

0赞 curios 4/25/2023
levenshtein 距离为 7 会给出许多误报。我需要将输入数组与数据帧列匹配。有没有其他方法可以做到这一点。array_join似乎只是在语法上是正确的。