如何避免PySpark左连接中唯一键id重复引发歧义
PySpark左连接id列歧义问题解决方法
问题原因
执行左连接后,df_1和df_2的id列同时保留在结果DataFrame中,后续操作引用id时,Spark无法确定要使用哪一个,因此抛出歧义错误。
解决方案
方案1:连接后删除重复的id列
连接完成后,直接删除df_2中的id列,只保留df_1的id:
df_join = df_1.join(df_2, df_1.id == df_2.id, "left").drop(df_2.id)
方案2:使用on参数指定连接列(推荐)
直接用on="id"代替指定两列相等的写法,Spark会自动合并同名的连接列,只保留一个id,从根源避免歧义:
df_join = df_1.join(df_2, on="id", how="left")
如果需要给DataFrame加别名(方便后续复杂操作),也可以这么写:
df_join = df_1.alias("a").join(df_2.alias("b"), on="id", how="left")
方案3:重命名其中一个id列(需保留两个id时用)
如果需要同时保留两个DataFrame的id列做对比,可以先给df_2的id重命名,再执行连接:
df_join = df_1.join(df_2.withColumnRenamed("id", "id_2"), df_1.id == df_2.id_2, "left")
此时结果中的id列分别为id(来自df_1)和id_2(来自df_2),不会出现歧义。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

