【问题标题】:Performing updates/overwrite to tables in Azure SQL Database from Databricks从 Databricks 对 Azure SQL 数据库中的表执行更新/覆盖
【发布时间】:2019-12-14 06:51:10
【问题描述】:

在 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

需要知道在我的情况下如何执行更新/覆盖。另外请让我知道需要导入库。

【问题讨论】:

  • 您可以使用以下语法使用合并表MERGE INTO logs USING updates ON logs.uniqueId = updates.uniqueId WHEN NOT MATCHED THEN INSERT *link
  • 感谢 Praveen,我正在尝试,但我将如何将最终结果发布到数据库。合并表也指数据库中的实际表?在这种情况下,您能否准确分享我需要使用的步骤(要使用哪个库,如何提供数据库凭据)。我在 Azure SQL 数据库中有插入/更新的表。我得到了合并语法,但我不知道实现相同的确切实现步骤。
  • sudipta 请通过此链接link 它将提供有关如何更新/覆盖 sql 数据库的详细信息。如果您仍然遇到任何问题,请给我评论。
  • 覆盖所有内容?

标签: python azure-sql-database databricks


【解决方案1】:

尝试将设置为 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 截断现有表 而不是删除并重新创建它。这可以更有效,并且 防止删除表元数据(例如,索引)。 但是,它在某些情况下不起作用,例如当新数据有 不同的架构。它默认为假。此选项仅适用于 写作。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 2019-06-23
    • 2020-09-23
    • 2022-11-23
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多