我的pyspark版本是2.1.1。我试图加入两个具有两个列 id 和 priority 的数据框(左外侧)。我正在创建这样的数据框:
a = "select 123 as id, 1 as priority"
a_df = spark.sql(a)
b = "select 123 as id, 1 as priority union select 112 as uid, 1 as priority"
b_df = spark.sql(b)
c_df = a_df.join(b_df, (a_df.id==b_df.id), 'left').drop(b_df.priority)
c_df 模式作为DataFrame[uid: int, priority: int, uid: int, priority: int]
放置功能未删除列。
但是,如果我尝试这样做:
c_df = a_df.join(b_df, (a_df.id==b_df.id), 'left').drop(a_df.priority)
然后删除a_df的优先级列。
不确定是否存在版本更改问题或其他问题,但是drop函数会像这样感觉很奇怪。
我知道解决方法可以是先删除不需要的列,然后再进行联接。但是仍然不确定为什么放置功能不起作用吗?
谢谢。
答案 0 :(得分:0)
与pyspark中的连接重复的列名称会导致无法预料的行为,在连接之前,我已阅读过消除歧义的名称。来自stackoverflow的Spark Dataframe distinguish columns with duplicated name和Pyspark Join and then column select is showing unexpected output。很抱歉,我找不到您所描述的为什么 pyspark无法正常工作。
但是数据砖文档解决了这个问题:https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html
来自数据块:
如果您在Spark中执行联接但未正确指定联接,则会得到重复的列名。这使选择这些列变得更加困难。本主题和笔记本演示了如何执行联接,以便您没有重复的列。
加入时,您可以尝试使用alias
(通常是我所使用的),也可以将列以list
类型或str
的形式加入。
df = left.join(right, ["priority"])