覆盖数据时如何在pyspark jdbc中将autocommit设置为false

问题描述 投票:0回答:1

我想检查 Spark jdbc 是否提供了将自动提交设置为 false 的方法。我正在将数据帧写入已经有一些数据的 postgres 表。如果存在任何写入问题,整个表将被删除,之前的数据也会丢失。即使我在 jdbc 属性中使用 truncate=True 选项,表结构仍保留,但数据会丢失。那么有没有办法将autocommit设置为false,写入成功后手动commit呢?

我正在使用以下 jdbc 连接字符串。

targeturl = f"jdbc:postgresql://{host_tar}:{port_tar}/{db_tar}?currentSchema={schema_tar}"

我们是否需要向此 URL 添加任何其他参数来启动自动提交?

apache-spark pyspark jdbc databricks azure-databricks
1个回答
0
投票

要将 JDBC 连接 URL 中的 autoCommit 属性设置为 false,可以修改 targeturl

targeturl = f"jdbc:postgresql://{host_tar}:{port_tar}/{db_tar}?currentSchema={schema_tar}&autoCommit=false"

enter image description here

这会将 JDBC 连接 URL 中的 autoCommit 属性设置为 false,这将禁用自动提交并允许您在写入成功后手动提交事务。

您可以通过调用 JDBC 连接对象上的 commit 方法来手动提交事务。

df.write \
    .format("jdbc") \
    .option("url", targeturl) \
    .option("dbtable", table_name) \
    .option("user", username) \
    .option("password", password) \
    .mode("append") \
    .save()

您可以像这样手动提交交易

connection = DriverManager.getConnection(targeturl, username, password)
connection.commit()
© www.soinside.com 2019 - 2024. All rights reserved.