在一条语句中连接多个数据框并仅选择必需的列

时间:2018-06-27 01:04:42

标签: python pyspark pyspark-sql

我有以下Spark DataFrames:

  • df1的列为(id, name, age)
  • df2的列为(id, salary, city)
  • df3的列为(name, dob)

我想使用Python加入所有这些Spark数据框架。这是我需要复制的SQL语句。

SQL:

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

我使用python在Pyspark中尝试了以下内容,但收到错误。

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

我的问题:我们可以一次加入所有三个DataFrame并选择所需的列吗?

2 个答案:

答案 0 :(得分:1)

您可以利用colalias使类似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')

答案 1 :(得分:1)

如果您的SQL查询有效,为什么不使用pyspark-sql

首先使用pyspark.sql.DataDrame.createOrReplaceTempView()将您的DataFrame注册为临时表:

df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')
df3.createOrReplaceTempView('df3')

现在,您可以使用在createOrReplaceTempView()的参数中提供的名称,以表的形式访问这些DataFrame。使用pyspark.sql.SparkSession.sql()执行查询:

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)