当前位置: 首页 > 知识库问答 >
问题:

pyspark中的左外部联接后,Drop函数不起作用

乜栋
2023-03-14

我的pyspark版本是2.1.1。我试图加入两个数据帧(左外)有两列id和优先级。我是这样创建我的数据框架的:

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: 整型, 优先级: 整型, uid: 整型, 优先级: 整型]

删除函数不会删除列。

但是如果我试着去做:

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

则删除a_ df的优先级列。

不确定是否存在版本更改问题或其他问题,但感觉非常奇怪的是,drop函数的行为会像这样。

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

提前致谢。

共有1个答案

轩辕源
2023-03-14

pyspark中带有连接的重复列名会导致不可预测的行为,我已经阅读过以在连接之前消除名称的歧义。从stackoverflow中,Spark Dataframe区分具有重复名称和Pyspark Join的列,然后列选择显示意外输出。很抱歉,我找不到为什么pyspark不能像您描述的那样工作。

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

数据中:

如果在Spark中执行连接,并且没有正确地指定连接,那么最终会出现重复的列名。这使得选择这些列更加困难。本主题和笔记本演示了如何执行联接以避免出现重复的列。

当您加入时,您可以尝试使用别名(这通常是我使用的),也可以将列作为列表类型或str加入。

df = left.join(right, ["priority"]) 
 类似资料:
  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表:A,B和C。 令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。 令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。 让C包含ID和VALUE两列,其中ID是表C的主键

  • 为什么我不能在SELECT部分执行NULL测试?有办法解决这个问题吗?

  • 问题内容: 我正在尝试使用以下查询获取每天打开的页面数。 我得到的输出是这样的: 问题是,在我的日表中,我有一列包含数字1到30来代表一个月中的日子。我进行了左外部连接,希望在天数列中显示所有天数! 但是我的查询正在这样做,为什么会这样呢? 谢谢大家的帮助。 问题答案: Nanne给出的答案解释了为什么您没有得到期望的结果(您的WHERE子句删除了行),但是却没有解决方法。 解决方案是将WHERE

  • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的

  • 问题内容: 我有这些表, 和。我想执行左外部联接。 劳斯莱斯 推出 SUMing,JOINing和GROUPings之后的预期输出==> 我的代码: 但是上面代码的O / P是 我不知道我要去哪里错了-你能解释一下吗? 问题答案: 您没有做错任何事。这就是JOIN的行为 它是左边的行数X右边的行数,在您的情况下为3 x 2 = 6。 试试这个 SQLFiddle 我知道这不适用于SQL Serve