如何向DataFrame添加另一DataFrame存在的缺失列且避免循环withColumn
错误原因
- 逻辑写反:你需要获取的是
df2存在但df1不存在的列,原有写法遍历df1.columns判断是否不在df2.columns中,拿到的是df1独有、df2没有的列,和需求完全相反。 - 语法错误:
select()方法不支持直接传入生成器对象作为参数,你写的推导式没有转换成列表就直接传入,才会触发类型报错。
正确实现
首先导入依赖的函数和类型:
from pyspark.sql.functions import lit from pyspark.sql.types import StringType
一次性完成列新增,无需循环调用withColumn:
# 提取 df2 有、df1 没有的列名集合 missing_cols = set(df2.columns) - set(df1.columns) # 生成空列列表 add_cols = [lit(None).cast(StringType()).alias(col_name) for col_name in missing_cols] # 解包列表传入select完成新增 df1 = df1.select("*", *add_cols)
这个实现只会触发一次Spark执行计划生成,性能和单次select操作一致,远优于循环多次调用withColumn的写法。
内容的提问来源于stack exchange,提问作者Wasserwaage
相关产品推荐
相关产品推荐

