尝试在PYSPARK中的Nonetype属性(null)上跳过python UDF

时间:2018-11-06 00:59:04

标签: python pyspark pyspark-sql

我有pyspark数据框,其中有Firstname和Middlename列。 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'

我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

通过使用'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|
+-----+----------+