首页 > 解决方案 > spark中的jdbc更新语句

问题描述

我使用 JDBC 连接到数据库,并且正在尝试运行更新查询。首先我输入查询,然后执行它(就像我执行 SELECT 一样,它工作得很好)。

caseoutputUpdateQuery = "(UPDATE dbo.CASEOUTPUT_TEST SET NOTIFIED = 'YES') alias_output "
spark.read.jdbc(url=jdbcUrl, table=caseoutputUpdateQuery, properties=connectionProperties) 

当我运行它时,出现以下错误:

A nested INSERT, UPDATE, DELETE, or MERGE statement must have an OUTPUT clause.

我试图以不同的方式解决这个问题,但总是有另一个错误。例如,我尝试通过以下方式重写查询:

caseoutputUpdateQuery = "(UPDATE dbo.CASEOUTPUT_TEST SET NOTIFIED = 'YES' OUTPUT DELETED.*, INSERTED.* FROM dbo.CASEOUTPUT_TEST) alias_output " 

但我遇到了这个错误: A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement.

我试图重写它的另一种方式是:

caseoutputUpdateQuery = "(INSERT INTO dbo.UpdateOutput(OldCaseID,NotifiedOld) SELECT * FROM( UPDATE dbo.CASEOUTPUT_TEST SET NOTIFIED = 'YES' OUTPUT deleted.OldCaseID,DELETED.NotifiedOld ) AS tbl) alias_output " 

但我有这个错误:

A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed inside another nested INSERT, UPDATE, DELETE, or MERGE statement.

我真的尝试了我在互联网上找到的所有东西,但没有运气。你对我如何解决这个问题并运行我的更新语句有什么建议吗?

标签: apache-sparkjdbcdatabricks

解决方案


我认为 Spark 不是为那个 UPDATE 语句用例而设计的。这不是 Spark 可以帮助处理 RDBMS 的场景。我建议使用您正在编写的代码中的 JDBC 使用直接连接(我的意思是直接调用该 JDBC)。如果您使用的是 Scala,则可以按照此处的建议使用(例如,但还有其他多种方式)或按照此处的说明从 Python 使用。这些示例到达 Oracle 引擎,但如果您使用 MySQL、SQL Server、Postgres 或任何其他 RDMBS,请更改驱动程序/连接器


推荐阅读