You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark多个DataFrame对齐合并应选JOIN/UNION/APPEND哪种?

场景判断

该场景属于 JOIN(全外连接) 的适用场景,另外两个操作不适用于当前需求:

  • UNION、APPEND都是针对列结构完全相同的表做行维度的拼接,你所持有的4个表各自带有不同的count列,不符合行拼接的要求。
  • 你的需求是按共同的业务键order、device做匹配,将四个表的不同count列汇总到同一行,完全符合多表JOIN的特征。
具体实现代码

提供两种常用实现方案:

方案1:逐表全外连接

适合表数量少的场景,代码直观易维护:

from pyspark.sql import functions as F

# 假设4个DataFrame分别命名为df1、df2、df3、df4
result_df = df1.join(df2, on=['order', 'device'], how='full_outer') \
               .join(df3, on=['order', 'device'], how='full_outer') \
               .join(df4, on=['order', 'device'], how='full_outer') \
               .orderBy('order') # 可选,按order排序后即可和你给出的示例结果顺序一致

方案2:统一结构后union + 分组聚合

适合表数量多的场景,后续新增count类表只需要加进处理列表即可,可扩展性更强:

from pyspark.sql import functions as F

# 给每个df补全所有count列,缺失列默认设为null
df1_processed = df1.withColumn('count_2', F.lit(None)) \
                   .withColumn('count_3', F.lit(None)) \
                   .withColumn('count_4', F.lit(None))
df2_processed = df2.withColumn('count_1', F.lit(None)) \
                   .withColumn('count_3', F.lit(None)) \
                   .withColumn('count_4', F.lit(None))
df3_processed = df3.withColumn('count_1', F.lit(None)) \
                   .withColumn('count_2', F.lit(None)) \
                   .withColumn('count_4', F.lit(None))
df4_processed = df4.withColumn('count_1', F.lit(None)) \
                   .withColumn('count_2', F.lit(None)) \
                   .withColumn('count_3', F.lit(None))

# 全部union后按业务键分组,取各count列的非空值即可
result_df = df1_processed.unionByName(df2_processed) \
                         .unionByName(df3_processed) \
                         .unionByName(df4_processed) \
                         .groupBy('order', 'device') \
                         .agg(
                             F.max('count_1').alias('count_1'),
                             F.max('count_2').alias('count_2'),
                             F.max('count_3').alias('count_3'),
                             F.max('count_4').alias('count_4')
                         ).orderBy('order')

内容的提问来源于stack exchange,提问作者earl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:24:03