Pyspark:如何仅在具有 NotNull 值的行上应用 UDF
Posted
技术标签:
【中文标题】Pyspark:如何仅在具有 NotNull 值的行上应用 UDF【英文标题】:Pyspark: How to Apply UDF only on Rows with NotNull Values 【发布时间】:2020-12-06 18:07:27 【问题描述】:我有一个 pyspark 数据框,想在具有 Null 值的列上应用 UDF。
下面是我的数据框:
+----+----+
| a| b|
+----+----+
|null| 00|
|.Abc|null|
|/5ee| 11|
|null| 0|
+----+----+
下面是所需的数据框(如果行值不为 Null,请删除标点符号并将列 a 中的字符串值更改为大写):
+----+----+
| a| b|
+----+----+
|null| 00|
| ABC|null|
| 5EE| 11|
|null| 0|
+----+----+
下面是我的 UDF 和代码:
import pyspark.sql.functions as F
import re
remove_punct = F.udf(lambda x: re.sub('[^\w\s]', '', x))
df = df.withColumn('a', F.when(F.col("a").isNotNull(), F.upper(remove_punct(F.col("a")))))
以下是错误:
TypeError: expected string or bytes-like object
您能否建议获得所需 DF 的最佳解决方案是什么?
提前致谢!
【问题讨论】:
【参考方案1】:使用 regexp_replace。不需要 UDF。
df = df.withColumn('a', F.upper(F.regexp_replace(F.col('a'), '[^\w\s]', '')))
如果你坚持使用UDF,你需要这样做:
remove_punct = F.udf(lambda x: re.sub('[^\w\s]', '', x) if x is not None else None)
df = df.withColumn('a', F.upper(remove_punct(F.col("a"))))
【讨论】:
以上是关于Pyspark:如何仅在具有 NotNull 值的行上应用 UDF的主要内容,如果未能解决你的问题,请参考以下文章
如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列