试图在 PYSPARK 中的 Nonetype 属性(null)上跳过 python UDF
Posted
技术标签:
【中文标题】试图在 PYSPARK 中的 Nonetype 属性(null)上跳过 python UDF【英文标题】:Trying to skip python UDF on Nonetype attribute (null) in PYSPARK 【发布时间】:2018-11-06 00:59:04 【问题描述】:我有带有 Firstname 和 Middlename 列的 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' object has no attribute 'isNull'
我在这里缺少什么?
【问题讨论】:
【参考方案1】:通过使用'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
内进行 null 检查以避免出现 Nonetype
错误:
replacehyphens = udf(lambda s: s.replace('-', '') if s else '')
df.withColumn('Middlename', replacehyphens('Middlename')).show()
+-----+----------+
|FName|Middlename|
+-----+----------+
| Avi| |
| Chec| Boriin|
| Meg| |
| Zen| Chagn|
+-----+----------+
【讨论】:
嗨 Psidom,当我使用列 customer_df = customer_df.withColumn('MiddleName',when(col('MiddleName').isNull,lit('')).otherwise(stripsc(col('中间名字')))) 。我收到 TypeError: condition should be a Column。我尝试创建 udf 的原因是,我会根据传入的数据框向其中添加更多特殊字符 你错过了isNull
后面的括号吗?注意它是isNull()
。
啊,明白了!谢谢!以上是关于试图在 PYSPARK 中的 Nonetype 属性(null)上跳过 python UDF的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:'NoneType'对象没有属性'upper'[关闭]
将 udf 调用移动到新函数后的 azure pyspark udf 属性 nonetype
在 Pyspark 中使用 contains 和 udf 时出现问题:AttributeError: 'NoneType' object has no attribute 'lower'
Pyspark 错误:TypeError:不能将类型 <type 'NoneType'> 视为向量 [重复]