即使使用 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】:

所以appendoverwrite 模式在表已经存在时不会抛出错误。从 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?

如何使用 PySpark 检查 Hive 表是不是存在

在 pyspark 查询中使用临时表

使用 pySpark 将 DataFrame 写入 mysql 表

如何使用 pyspark 将 null 分配给配置单元表列

如何使用 JDBC 源在 (Pyspark?