在Azure Databricks中,该表已在Azure SQL仓库中创建,我想对Azure SQL数据库中的现有数据库执行更新,或在我的作业运行时覆盖其内容
我可以追加,但是在执行etl时执行更新/覆盖时遇到了问题。 我尝试了下面的方法,但是它删除了表,并尝试用新记录集重新创建,这不是我想要的。
def insupd(df,tabname):
df.write.mode("overwrite") \
.format("jdbc") \
.option("url", jdbcUrl) \
.option("dbtable", tabname) \
.option("user",jdbcUsername) \
.option("password", jdbcPassword) \
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
.save()
return True
需要了解如何执行我的情况下的更新/覆盖。另外,请告知我需要导入库。
答案 0 :(得分:0)
尝试将设置为true的truncate选项添加到您的写操作中:
.option("truncate", True)
请参阅此文章以对此进行解释:https://www.waitingforcode.com/apache-spark-sql/savemode.overwrite-trap-rdbms-apache-spark-sql/read
,并来自docs:
这是与JDBC编写器相关的选项。当SaveMode.Overwrite为 启用后,此选项会导致Spark截断现有表 而不是删除并重新创建它。这样可以更有效,并且 防止删除表元数据(例如索引)。 但是,在某些情况下(例如,新数据包含 不同的模式。默认为false。此选项仅适用于 写作。