尝试跳过 PYSPARK 中 Nonetype 属性(空)的 python UDF

Trying to skip python UDF on Nonetype attribute (null) in PYSPARK

我有包含名字和中间名列的 pyspark 数据框。 Middlename 列中有空值。

customer_df=

FName Middlename 
Avi   null
Chec  Bor-iin
Meg   null
Zen   Cha-gn

我已经编写了 UDF 来去除连字符

from pyspark.sql.functions import col, udf, upper, lit, when
replacehyphens = udf(lambda string_val: string_val.replace('-',''))
customer_df=customer_df.withColumn('Middlename',
when('Middlename'.isNull,lit('')).otherwise
(replacehyphens(col('Middlename'))))

我收到 AttributeError:'str' 对象没有属性 'isNull'

我在这里错过了什么?

通过使用 'Middlename'.isNull,您是在字符串而不是列对象上调用 isNull 方法。您需要 col('Middlename').isNull()df.Middlename.isNull();或者您可以使用 regexp_replace 方法而不是创建 udf:

from pyspark.sql.functions import regexp_replace
df.withColumn('Middlename', regexp_replace(df.Middlename, '-', '')).show()
+-----+----------+
|FName|Middlename|
+-----+----------+
|  Avi|      null|
| Chec|    Boriin|
|  Meg|      null|
|  Zen|     Chagn|
+-----+----------+

要用空字符串替换 null,请使用 na.fill(''):

df.withColumn('Middlename', regexp_replace(df.Middlename, '-', '')).na.fill('', 'Middlename').show()
+-----+----------+
|FName|Middlename|
+-----+----------+
|  Avi|          |
| Chec|    Boriin|
|  Meg|          |
|  Zen|     Chagn|
+-----+----------+

如果您必须使用 udf,请确保在 udf 中执行空检查以避免 Nonetype 错误:

replacehyphens = udf(lambda s: s.replace('-', '') if s else '')
df.withColumn('Middlename', replacehyphens('Middlename')).show()
+-----+----------+
|FName|Middlename|
+-----+----------+
|  Avi|          |
| Chec|    Boriin|
|  Meg|          |
|  Zen|     Chagn|
+-----+----------+