【问题标题】:How to update a Azure SQL Database/Data Warehouse table by azure Databricks?如何通过 azure Databricks 更新 Azure SQL 数据库/数据仓库表?
【发布时间】:2019-06-18 02:21:09
【问题描述】:

我的项目中有一个要求,我在 Azure SQL DW 中实现 SCD 类型 2 表。我可以使用 JDBC 连接器插入新记录,但我需要将旧记录更新为“过期”并根据更新的值更新其他记录。

【问题讨论】:

    标签: azure-sql-database databricks azure-sqldw azure-databricks azure-sql-data-warehouse


    【解决方案1】:

    推荐的模式是使用Databricks Azure SQL DW Connector 批量加载临时表,或者将新数据写入blob 存储中的文件,或者datalake 并使用Polybase 外部表来保存新行。

    然后,一旦新数据被加载到临时表中,或者在 Polybase 外部表中可用,编写一个 TSQL 存储过程来“将旧记录更新为“过期”并根据更新的值更新其他记录”。

    Spark 只知道如何运行查询和加载表。但是您已经安装了 JDBC 驱动程序,并且可以使用 Scala 或 Java 的 JDBC 访问。例如:

    %scala
    
    import java.util.Properties
    import java.sql.DriverManager
    
    val jdbcUsername = dbutils.secrets.get(scope = "kv", key = "sqluser")
    val jdbcPassword = dbutils.secrets.get(scope = "kv", key = "sqlpassword")
    val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    
    // Create the JDBC URL without passing in the user and password parameters.
    val jdbcUrl = s"jdbc:sqlserver://xxxxx.database.windows.net:1433;database=AdventureWorks;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
    
    val connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)
    val stmt = connection.createStatement()
    val sql = """
    
    exec usp_someproc ...
    
    """
    
    stmt.execute(sql)
    
    connection.close()
    

    【讨论】:

    • 这听起来不错。但是有什么方法可以避免 TSQL 存储过程并在数据块或任何其他方式中执行此操作。
    • 您可以在加载暂存数据后使用 JDBC 从 Databricks 运行相同的 TSQL INSERT 和 UPDATE 命令。存储过程只会将这些命令存储在 SQL Server 上。运行时没有真正的区别。
    • 这听起来不错。但是如何从 spark 调用存储过程?
    • 在 Azure SQL 中暂存数据后,是否无法仅从 databricks 运行 TSQL 命令?
    • 通过运行任意 SQL 批处理的示例查看更新的答案。
    猜你喜欢
    • 2019-11-09
    • 2016-06-30
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2020-02-21
    • 2016-02-06
    • 2021-03-04
    相关资源
    最近更新 更多