PySpark如何合并DataFrame含空值的两列并优先取首列非空值
PySpark实现优先取非空列新增字段的方案
核心实现方法
你这个需求刚好匹配PySpark内置的coalesce函数的能力:该函数会按传入顺序返回第一个不为null的列值,无需自己手动写条件判断逻辑,是当前场景的最优实现方案。
具体实现步骤
- 先导入依赖函数
from pyspark.sql.functions import coalesce
- 调用
withColumn方法新增Name列即可
df = df.withColumn("Name", coalesce("Name_ls", "Name_mg"))
完整可运行测试代码
如果你需要本地验证效果,可以直接运行以下代码:
from pyspark.sql import SparkSession from pyspark.sql.functions import coalesce # 初始化Spark会话 spark = SparkSession.builder.appName("get_name_col").getOrCreate() # 构造你提供的样例数据 test_data = [ ("Herry", None), (None, "Cong"), ("Duck", "Duck77"), ("Tinh", "Tin_Lee"), ("Huong", None), (None, "Ngon"), ("Lee", None) ] df = spark.createDataFrame(test_data, schema=["Name_ls", "Name_mg"]) # 新增Name列 df_result = df.withColumn("Name", coalesce("Name_ls", "Name_mg")) # 打印结果 df_result.show()
注:你预期输出里第二行
Name_mg的Luck属于样例笔误,上述逻辑不受笔误影响,运行结果完全匹配需求规则。
拓展:自定义条件写法
如果后续你需要调整判断逻辑(比如要加非空判断之外的过滤规则),也可以用when+otherwise的写法实现同等效果:
from pyspark.sql.functions import when, col df = df.withColumn("Name", when(col("Name_ls").isNotNull(), col("Name_ls")).otherwise(col("Name_mg")))
内容的提问来源于stack exchange,提问作者Tien Vu
相关产品推荐
相关产品推荐

