Python Pyspark:如何仅对具有NotNull值的行应用UDF
我有一个pyspark数据框架,希望对具有空值的列应用UDF 下面是我的数据框:Python Pyspark:如何仅对具有NotNull值的行应用UDF,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我有一个pyspark数据框架,希望对具有空值的列应用UDF 下面是我的数据框: +----+----+ | a| b| +----+----+ |null| 00| |.Abc|null| |/5ee| 11| |null| 0| +----+----+ 下面是所需的数据帧(如果行值不为空,请删除标点并将列a中的字符串值更改为大写): 以下是我的自定义项和代码: import pyspark.sql.functions as F import re remove_punct
+----+----+
| a| b|
+----+----+
|null| 00|
|.Abc|null|
|/5ee| 11|
|null| 0|
+----+----+
下面是所需的数据帧(如果行值不为空,请删除标点并将列a中的字符串值更改为大写):
以下是我的自定义项和代码:
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的最佳解决方案吗
提前谢谢 使用regexp\u替换。不需要自定义项
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"))))
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"))))