PySpark检查三列空值并新增值为PASS/FAIL的target列方法
PySpark 多列全空判断新增target列实现方案
你最初的写法仅完成了单列空值判断,且没有将布尔结果映射为自定义的PASS/FAIL字符串,通过内置的条件分支函数搭配多列空值判断逻辑即可完成需求,完全不需要用到UDF,以下是两种可直接运行的高性能实现方式:
- 方式1:多条件逻辑与判断(语义最直观)
对三列分别做空值判断,用逻辑与连接,全部满足空值条件时赋值PASS,否则赋值FAIL。注意每个空值判断条件需要用括号包裹,避免运算符优先级导致的报错:# 导入需要的内置函数 from pyspark.sql.functions import col, when df = df.withColumn( "target", when( col("column_1").isNull() & col("column_2").isNull() & col("column_3").isNull(), "PASS" ).otherwise("FAIL") ) - 方式2:coalesce函数简化写法(列数多时更高效)
利用内置函数coalesce的特性:返回传入列列表中第一个非null值,若所有列全为null则返回null,可以大幅简化多列判断的写法,不需要逐列写isNull()做逻辑连接:from pyspark.sql.functions import col, when, coalesce df = df.withColumn( "target", when(coalesce("column_1", "column_2", "column_3").isNull(), "PASS").otherwise("FAIL") )
两种写法的逻辑均能被Spark原生Catalyst优化器直接解析执行,无Python UDF存在的序列化、跨进程调用开销,执行性能和你之前写的单列空值判断完全一致。执行完成后调用
df.show()即可得到你给出示例中的预期输出。
内容的提问来源于stack exchange,提问作者AndronikMk
相关产品推荐
相关产品推荐

