我有以下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并选择所需的列吗?
答案 0 :(得分:1)
您可以利用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')
答案 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)