我有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'
我在这里想念什么?
答案 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|
+-----+----------+