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

