【问题标题】:Drop function not working after left outer join in pysparkpyspark中的左外连接后删除功能不起作用
【发布时间】:2019-07-05 02:33:08
【问题描述】:

我的 pyspark 版本是 2.1.1。我正在尝试加入具有两列 idpriority 的两个数据框(左外)。我正在创建这样的数据框:

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]

的形式出现

drop 函数不会删除列。

但如果我尝试这样做:

c_df = a_df.join(b_df, (a_df.id==b_df.id), 'left').drop(a_df.priority)

然后 a_df 的优先级列被删除。

不知道是不是版本变更问题或者别的什么,但是drop函数会这样表现感觉很奇怪。

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    在 pyspark 中使用连接重复的列名称会导致不可预测的行为,我已经阅读过在加入之前消除名称的歧义。来自 stackoverflow,Spark Dataframe distinguish columns with duplicated namePyspark Join and then column select is showing unexpected output。很抱歉,我找不到 为什么 pyspark 不能像你描述的那样工作。

    但 databricks 文档解决了这个问题:https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html

    来自数据块:

    如果您在 Spark 中执行联接但未正确指定联接,您最终会得到重复的列名。这使得选择这些列变得更加困难。本主题和笔记本演示了如何执行连接,以免出现重复的列。

    当您加入时,您可以尝试使用alias(这通常是我使用的),或者您可以将列加入为list 类型或str

    df = left.join(right, ["priority"]) 
    

    【讨论】:

    • 同意别名(或删除不相关的列将起作用),但我仍然很困惑为什么右侧 df 的列不会被删除,但左侧的列方会。同样通过内部连接,我可以删除任何内容。
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2018-07-17
    相关资源
    最近更新 更多