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
相关产品推荐
相关产品推荐

