在pyspark中左外部联接后,放置功能不起作用

时间:2019-02-11 14:55:13

标签: pyspark apache-spark-sql pyspark-sql

我的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函数会像这样感觉很奇怪。

我知道解决方法可以是先删除不需要的列,然后再进行联接。但是仍然不确定为什么放置功能不起作用吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

与pyspark中的连接重复的列名称会导致无法预料的行为,在连接之前,我已阅读过消除歧义的名称。来自stackoverflow的Spark Dataframe distinguish columns with duplicated namePyspark 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"])