尝试跳过 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|
+-----+----------+
我有包含名字和中间名列的 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|
+-----+----------+