试图在 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'> 视为向量 [重复]

Pyspark UDF AttributeError:“NoneType”对象没有属性“_jvm”

TypeError:'NoneType' 对象不可下标我试图创建这个应用程序,它给了我这个错误 f