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

PySpark DataFrame左连接:重名列保留与列顺序调整方案咨询

PySpark DataFrame左连接保留指定列并调整列顺序的解决方法

问题场景

需要对两个PySpark DataFrame执行左连接,要求:

  • 保留第一个DataFrame(df_1)的全部列
  • 仅提取第二个DataFrame(df_2)的Currency列
  • 解决两DataFrame同名Code列的冲突问题,需保留df_1的Code列
  • 将Code列设为结果DataFrame的最左侧列

示例DataFrame定义:

# df_1 定义
data_1 = [
    (1, "Italy", "Europe"),
    (2, "Italy", "Europe"),
    (3, "Germany", None),
    (4, "Iran", "Asia"),
    (5, "China", "Asia"),
    (6, "China", None),
    (7, "Japan", "Asia"),
    (8, "France", None),
]
columns = ["Code", "Country", "Continent"]
df_1 = spark.createDataFrame(data=data_1, schema=columns)

# df_2 定义
data_2 = [
    (1, "Italy", "EUR", 11),
    (2, "Germany", "EUR", 12),
    (3, "China", "CNY", 13),
    (4, "Japan", "JPY", 14),
    (5, "France", "EUR", 15),
    (6, "Taiwan", "TWD", 16),
    (7, "USA", "USD", 17),
    (8, "India", "INR", 18),
]
columns = ["Code", "Country", "Currency", "Sales"]
df_2 = spark.createDataFrame(data=data_2, schema=columns)

直接执行左连接会出现两个Code列,而使用drop('Code')会同时删除两个列,无法保留df_1的Code。


解决方案1:提前筛选df_2的列(推荐)

在执行连接前,先对df_2进行列筛选,只保留连接键Country和需要提取的Currency列,从根源避免同名列冲突,同时减少连接操作的数据量,提升效率。

# 筛选df_2仅保留需要的列
df_2_filtered = df_2.select("Country", "Currency")
# 左连接
output = df_1.join(df_2_filtered, on="Country", how="left")
# 调整列顺序,将Code移至最左侧
final_output = output.select("Code", *[col for col in output.columns if col != "Code"])
final_output.show(truncate=False)

解决方案2:连接后精准删除df_2的同名列

如果需要从df_2提取多列且存在多个同名列,可在连接时明确指定连接条件(不使用列表形式的连接键),这样同名列会保留各自的DataFrame前缀,再精准删除df_2的Code列。

# 左连接,明确指定连接条件以区分同名列
output = df_1.join(df_2, df_1.Country == df_2.Country, "left")
# 保留df_1全部列 + df_2的Currency,删除无关列
output_clean = output.select(df_1["*"], df_2["Currency"]).drop(df_2["Code"], df_2["Sales"])
# 调整列顺序
final_output = output_clean.select("Code", *[col for col in output_clean.columns if col != "Code"])
final_output.show(truncate=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:40:25