即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表
Posted
技术标签:
【中文标题】即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表【英文标题】:How to write into Microsoft SQL Server table even if table exist using PySpark 【发布时间】:2015-10-11 13:52:56 【问题描述】:我有一个 PySpark 代码,它可以像这样写入 SQL Server 数据库
df.write.jdbc(url=url, table="AdventureWorks2012.dbo.people", properties=properties)
但是问题是,即使表存在,我也想继续在表中写入人员,并且我在 Spark 文档中看到可能存在选项错误、追加、覆盖和忽略模式,并且所有这些都会引发错误,如果表已存在于数据库中,则对象已存在。
Spark throw 跟随错误 py4j.protocol.Py4JJavaError: 调用 o43.jdbc 时出错。 com.microsoft.sqlserver.jdbc.SQLServerException:数据库中已经有一个名为“people”的对象
即使表已经退出,有没有办法将数据写入表中? 请让我知道您需要更多解释
【问题讨论】:
【参考方案1】:对我来说,问题在于 Spark 1.5.2。它检查表是否存在 (here) 的方法是运行SELECT 1 FROM $table LIMIT 1
。如果查询失败,则表不存在。即使表在那里,该查询也会失败。
这在 1.6.0 (here) 中更改为 SELECT * FROM $table WHERE 1=0
。
【讨论】:
【参考方案2】:所以append
和overwrite
模式在表已经存在时不会抛出错误。从 spark 文档(http://spark.apache.org/docs/latest/sql-programming-guide.html#save-modes)SaveMode.Append
中将“将 DataFrame 保存到数据源时,如果数据/表已经存在,则 DataFrame 的内容应附加到现有数据中。”和SaveMode.Overwrite
将“覆盖模式意味着当将DataFrame保存到数据源时,如果数据/表已经存在,现有数据预计会被DataFrame的内容覆盖。”根据您希望如何处理现有表,这两个中的一个应该可以满足您的需求。
【讨论】:
@Holden 我正在加载这样的数据df.write.jdbc(url=url, table="AdventureWorks2012.dbo.people", mode="overwrite", properties=properties)
有什么问题,因为它仍然给出: com.microsoft.sqlserver.jdbc.SQLServerException: There is already an object named 'people' in the database
的错误吗?我正在使用火花 1.5
在span class="comcopy">在save模式下覆盖Spark会删除表,如果存在的话,运行查询的用户是否有删除表的权限?
@Holden 是的,用户有权删除表。我甚至通过使用我用来连接的相同用户名删除表来测试权限..以上是关于即使使用 PySpark 存在表,如何写入 Microsoft SQL Server 表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PySpark 将 JSON 列类型写入 Postgres?