我想使用一些非 pyspark 原生的字符串相似性函数,例如数据帧上的 jaro 和 jaro-winkler 度量。这些在 python 模块中很容易获得,例如jellyfish
。对于没有的情况,我可以写 pyspark udf 很好null
存在价值观,即将猫与狗进行比较。当我将这些 udf 应用于数据时null
价值观存在,但不起作用。在像我正在解决的问题中,其中一个字符串是很常见的null
我需要帮助让我的字符串相似性 udf 一般工作,更具体地说,在其中一个值是的情况下工作null
我编写了一个 udf,它在输入数据中没有空值时起作用:
from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType
import pyspark.sql.functions as F
import jellyfish.cjellyfish
def jaro_winkler_func(df, column_left, column_right):
jaro_winkler_udf = udf(f=lambda s1, s2: jellyfish.jaro_winkler(s1, s2), returnType=DoubleType())
df = (df
.withColumn('test',
jaro_winkler_udf(df[column_left], df[column_right])))
return df
输入和输出示例:
+-----------+------------+
|string_left|string_right|
+-----------+------------+
| dude| dud|
| spud| dud|
+-----------+------------+
+-----------+------------+------------------+
|string_left|string_right| test|
+-----------+------------+------------------+
| dude| dud|0.9166666666666666|
| spud| dud|0.7222222222222222|
+-----------+------------+------------------+
当我对具有空值的数据运行此操作时,我会得到通常的大量火花错误,最适用的似乎是TypeError: str argument expected
。我认为这是由于null
数据中的值,因为它在没有数据时起作用。
我修改了上面的函数来检查两个值是否不为空,并且只有在这种情况下才运行该函数,否则返回 0。
from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType
import pyspark.sql.functions as F
import jellyfish.cjellyfish
def jaro_winkler_func(df, column_left, column_right):
jaro_winkler_udf = udf(f=lambda s1, s2: jellyfish.jaro_winkler(s1, s2), returnType=DoubleType())
df = (df
.withColumn('test',
F.when(df[column_left].isNotNull() & df[column_right].isNotNull(),
jaro_winkler_udf(df[column_left], df[column_right]))
.otherwise(0.0)))
return df
但是,我仍然遇到与以前相同的错误。
示例输入以及我希望的输出:
+-----------+------------+
|string_left|string_right|
+-----------+------------+
| dude| dud|
| spud| dud|
| spud| null|
| null| null|
+-----------+------------+
+-----------+------------+------------------+
|string_left|string_right| test|
+-----------+------------+------------------+
| dude| dud|0.9166666666666666|
| spud| dud|0.7222222222222222|
| spud| null|0.0 |
| null| null|0.0 |
+-----------+------------+------------------+