【问题标题】:Delete rows from Azure Sql table using Azure Databricks with Scala使用带有 Scala 的 Azure Databricks 从 Azure Sql 表中删除行
【发布时间】:2020-04-21 07:34:14
【问题描述】:

我正在使用带有 Scala 的 Azure Databricks,我的目标是从 Azure SQL 表中删除一些行。

为了实现这一点,我使用 JDBC 的下推查询如下:

val pushdown_query = s"(DELETE FROM ${table_name} WHERE dump_date = '2020-01-07') temp"
val res = spark.read.jdbc(jdbcUrl, pushdown_query, connectionProperties)  

但是,我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: A nested INSERT, UPDATE, DELETE, or MERGE statement must have an OUTPUT clause.

我在下推查询中添加了 OUTPUT 子句来解决这个问题:

val pushdown_query = s"(DELETE FROM ${table_name} OUTPUT DELETED.dump_date WHERE dump_date = '2020-01-07') temp"

但现在我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: 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.

我做错了什么?我怎样才能做到这一点?有没有更好的办法?

提前致谢。

【问题讨论】:

    标签: sql scala azure azure-sql-database azure-databricks


    【解决方案1】:

    我还没有找到使用 Spark 从 Azure SQL 中删除行的方法,但我已经使用 Java 库在 Scala 中实现了我自己的函数:

    import java.util.Properties
    import java.sql.Connection
    import java.sql.DatabaseMetaData
    import java.sql.DriverManager
    import java.sql.SQLException
    import java.sql.Date
    import java.time.LocalDate
    
      
    // Set credentials
    var jdbcUsername = "X"
    var jdbcPassword = dbutils.secrets.get("X", "Y")
    
    // Chech that the JDBC driver is available
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
    
    // Create the JDBC URL
    var jdbcHostname = "X"
    var jdbcPort = 1433
    var jdbcDatabase = "X"
    val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
    
    def delete_dump_date(table_name:String, dump_date:String){
    
      val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
      var connObj:Connection = null
      var number_of_rows_deleted:Int = 0
      try{
          Class.forName(driverClass);
          connObj = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
          val statement = connObj.prepareStatement(String.format("DELETE FROM %s WHERE dump_date=?", table_name))
          try{
              statement.setDate(1, Date.valueOf(LocalDate.parse(dump_date)));
              number_of_rows_deleted = statement.executeUpdate();
          }
          finally{
              statement.close();
              println(number_of_rows_deleted + " rows deleted.")
          }
      }
      catch {
          case e:SQLException => e.printStackTrace();
      }
      finally{
          connObj.close();
      }
    }
    

    你可以调用函数:

    delete_dump_date(table_name, '2020-01-07')
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2020-09-23
      • 2021-08-22
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多