Python 在一条语句中连接多个数据帧并仅选择所需的列

Python 在一条语句中连接多个数据帧并仅选择所需的列,python,pyspark,pyspark-sql,Python,Pyspark,Pyspark Sql,我有以下Spark数据帧: df1带列(id、姓名、年龄) df2带列(id、薪资、城市) df3带列(名称,dob) 我想使用Python连接所有这些Spark数据帧。这就是我需要复制的SQL语句 SQL: 选择df1.*,df2.薪资,df3.dob 来自df1 在df1.id=df2.id上左连接df2 左连接df1上的df3.name=df3.name 我使用python在Pyspark中尝试了如下所示的内容,但收到了一个错误 join\u df=df1.join(df2,df1.

我有以下Spark数据帧:

  • df1
    带列
    (id、姓名、年龄)
  • df2
    带列
    (id、薪资、城市)
  • df3
    带列
    (名称,dob)
我想使用Python连接所有这些Spark数据帧。这就是我需要复制的SQL语句

SQL:

选择df1.*,df2.薪资,df3.dob
来自df1
在df1.id=df2.id上左连接df2
左连接df1上的df3.name=df3.name
我使用python在Pyspark中尝试了如下所示的内容,但收到了一个错误

join\u df=df1.join(df2,df1.id=df2.id,'left')\
.join(df3,df1.name=df3.name)\
.选择(df1.(*)、df2(名称)、df3(dob)

我的问题:我们能否一次性连接所有三个数据帧并选择所需的列?

您可以利用
col
alias
使类似SQL的语法正常工作。确保您的数据帧具有别名:

df1 = df1.alias('df1')
df2 = df2.alias('df2')
df3 = df3.alias('df3')
那么,以下几点应该起作用:

from pyspark.sql.functions import col

joined_df = df1.join(df2, col('df1.id') == col('df2.id'), 'left') \
.join(df3, col('df1.name') == col('df3.name'), 'left') \
.select('df1.*', 'df2.salary', 'df3.dob')

您可以利用
col
alias
使类似SQL的语法正常工作。确保数据帧具有别名:

df1 = df1.alias('df1')
df2 = df2.alias('df2')
df3 = df3.alias('df3')
那么,以下几点应该起作用:

from pyspark.sql.functions import col

joined_df = df1.join(df2, col('df1.id') == col('df2.id'), 'left') \
.join(df3, col('df1.name') == col('df3.name'), 'left') \
.select('df1.*', 'df2.salary', 'df3.dob')

如果您有一个可以工作的SQL查询,为什么不使用
pyspark SQL

首先用于将数据帧注册为临时表:

df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')
df3.createOrReplaceTempView('df3')
现在,您可以使用
createOrReplaceTempView()
的参数中提供的名称访问这些数据帧作为表。用于执行查询:

query = "select df1.*, df2.salary, df3.dob " \
        "from df1 " \
        "left join df2 on df1.id=df2.id "\
        "left join df3 on df1.name=df3.name"

joined_df = spark.sql(query)

如果您有一个可以工作的SQL查询,为什么不使用
pyspark SQL

首先用于将数据帧注册为临时表:

df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')
df3.createOrReplaceTempView('df3')
现在,您可以使用
createOrReplaceTempView()
的参数中提供的名称访问这些数据帧作为表。用于执行查询:

query = "select df1.*, df2.salary, df3.dob " \
        "from df1 " \
        "left join df2 on df1.id=df2.id "\
        "left join df3 on df1.name=df3.name"

joined_df = spark.sql(query)

我需要python not scala
df1的答案。(*)
的语法无效。我需要python not scala
df1的答案。(*)
是无效语法。@pault谢谢你指出这一点。我已经相应地更新了我的回答。我认为你甚至不需要这里的
df2
df3
的别名。我还没有测试过,但我认为以下应该有效:
加入了df=df1。别名('df1')。加入(df2,on='id',how='left')。加入(df3,on='name',how='left')。选择(“df1.*”、“工资”、“dob”)
@pault谢谢。我学到了一些新东西-下次有机会一定会尝试。@pault谢谢你的回答,它很有魅力,但是我想知道我们是否可以通过分组和字段求和,一次只选择必填字段,你能用同样的例子,按姓名、年龄和最大值(dob)分组吗并在其中仅选择列名称、年龄、maxdobgo@bobby1985StackOverflow上有许多帖子介绍了如何执行此操作。搜索窗口函数或聚合函数。如果这些函数不能解决您的问题,请提出一个新问题。@pault感谢您指出这一点。我已相应地更新了我的回答。我想您甚至不需要这里有
df2
df3
的别名。我还没有测试,但我认为以下应该可以使用:
joined\u df=df1.alias('df1')。join(df2,on='id',how='left')。join(df3,on='name',how='left')。选择('df1.*,'salary','dob'))
@pault谢谢。我学到了一些新东西-下次有机会一定会尝试。@pault谢谢你的回答,它很有魅力,但是我想知道我们是否可以通过分组和字段求和,一次只选择必填字段,你能用同样的例子,按姓名、年龄和最大值(dob)分组吗并在其中仅选择列名称、年龄、maxdobgo@bobby1985StackOverflow上有许多文章介绍了如何执行此操作。请搜索窗口函数或聚合函数。如果这些函数不能解决您的问题,请提出新问题。