如何基于其他列值填充Spark DataFrame中sum列的Null值?
解决Spark DataFrame中sum列Null值的动态填充问题
原始DataFrame:
+-----+-----+----+ |num_a|num_b| sum| +-----+-----+----+ | 1| 1| 2| | 12| 15| 27| | 56| 11|null| | 79| 3| 82| | 111| 114| 225| +-----+-----+----+
需求:填充sum列的Null值,用对应行的num_a + num_b计算结果填充,仅处理缺失值行,不新建列。此前尝试df.fillna结合UDF失败,原因是只能获取列名而非实际值。
可行解决方案
方法一:使用when+otherwise条件判断
直接对sum列做条件替换,仅修改Null值的行:
from pyspark.sql.functions import when, col # 直接更新sum列 df = df.withColumn("sum", when(col("sum").isNull(), col("num_a") + col("num_b")).otherwise(col("sum")))
方法二:使用coalesce函数(更简洁)
coalesce会返回传入参数中第一个非Null的值,刚好适配需求:
from pyspark.sql.functions import coalesce, col # 用coalesce直接替换Null值 df = df.withColumn("sum", coalesce(col("sum"), col("num_a") + col("num_b")))
为什么fillna+UDF不适用?
fillna的设计初衷是用固定值批量填充缺失值,虽然支持传入UDF,但UDF无法直接引用其他列的动态值——你之前遇到的"获取列名而非实际值"就是这个原因。而上面两种方法基于列表达式计算,能直接访问每行的实际数值,完美匹配动态填充的需求。
内容的提问来源于stack exchange,提问作者Tommy63
相关产品推荐
相关产品推荐

