Databricks中基于Apache Spark实现三个DataFrame左连接的技术咨询
Databricks中基于Apache Spark实现三个DataFrame左连接的技术咨询
我明白你现在的情况啦——习惯了Pandas里的DataFrame连接操作,现在转到Databricks用Apache Spark来处理三个DataFrame的左连接,目前是分步做两次左连接对吧?
先看你当前的代码:
joined_df = df_1.join(df_2, df_1["RECONTRACT"] == df_2["RECONTRACT"], "left") joined_df = joined_df.join(df_3, joined_df["RENTOBJECT"] == df_3["RENTOBJECT"], "left")
你想要把df_2和df_3都左连接到df_1上,其实你当前的写法是完全可行的,不过我可以给你几个优化或者更简洁的写法参考:
链式调用精简写法
可以把两次join操作链式写在一起,代码结构更紧凑:joined_df = df_1.join(df_2, on="RECONTRACT", how="left") \ .join(df_3, on="RENTOBJECT", how="left")当两个DataFrame的连接列名完全一致时,直接用
on参数指定列名,比显式写df_1["列名"] == df_2["列名"]要简洁很多。处理列名冲突的别名写法
如果df_2或df_3里存在和df_1重复的非连接列名,后续引用列时容易混淆,这时候可以给每个DataFrame起别名,让代码更清晰:from pyspark.sql.functions import col joined_df = df_1.alias("main") \ .join(df_2.alias("df2"), col("main.RECONTRACT") == col("df2.RECONTRACT"), how="left") \ .join(df_3.alias("df3"), col("main.RENTOBJECT") == col("df3.RENTOBJECT"), how="left")后续如果要筛选或处理特定来源的列,就可以用
col("main.xxx")或者col("df2.xxx")来精准定位,避免列名冲突的问题。
另外还要提个小细节:Spark的join和Pandas的merge/join在重复列处理上有区别,Spark用on指定列名时,会自动去重连接列,而Pandas默认会保留两边的连接列,这一点在后续数据处理时要留意哦。
备注:内容来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

