python - 在一个语句中连接多个数据框并仅选择所需的列
问题描述
我有以下 Spark DataFrame:
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 并选择所需的列吗?
解决方案
如果您有一个有效的 SQL 查询,为什么不使用pyspark-sql
?
首先用于pyspark.sql.DataDrame.createOrReplaceTempView()
将您的 DataFrame 注册为临时表:
df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')
df3.createOrReplaceTempView('df3')
现在,您可以使用您在参数中提供的名称以表的形式访问这些 DataFrame createOrReplaceTempView()
。用于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)
推荐阅读
- java - 为什么我的程序中的 ArrayList 插入速度比 LinkedList 快?
- ubuntu - `DllNotFoundException: libc` 尝试在 snap 包中运行单声道应用程序时
- oracle - Visual Basic 编译的可执行数据库连接问题
- charts - Highchart 甘特图 Navigator 颜色
- geolocation - Convert CEP (Brazilian ZIP code) in latitude and longitude
- python - Python/MySQL - 将 MySQL 数据导出到 Excel
- python - 使每个 Y 值对应 pyqtgraph 中的一个 X 值
- c# - 将 IAsyncEnumerable 转换为 List
- drake - 使用二阶系统模拟控制回路时的段错误
- performance - 极慢的查询,在 Windows 还原点之后