从 azure databricks 中删除 azure sql 数据库行

Delete azure sql database rows from azure databricks

我在 Azure SQL 数据库中有一个 table,我想根据某些条件从中删除选定的行,或者从 Azure Databricks 中删除整个 table。目前我正在使用 truncate 属性 of JDBC 来截断整个 table 而不删除它并且然后用新的数据框重写它。

df.write \
     .option('user', jdbcUsername) \
     .option('password', jdbcPassword) \
     .jdbc('<connection_string>', '<table_name>', mode = 'overwrite', properties = {'truncate' : 'true'} )

但今后我不想每次都截断并覆盖整个 table,而是使用删除命令。我也无法使用 下推查询 实现此目的。如有任何帮助,我们将不胜感激。

使用 pyodbc 执行 SQL 语句。

import pyodbc
conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};'
                       'SERVER=mydatabe.database.azure.net;'
                       'DATABASE=AdventureWorks;UID=jonnyFast;'
                       'PWD=MyPassword')
conn.execute('DELETE TableBlah WHERE 1=2')

让 pyodbc 在 Databricks 上工作有点痛苦 - 请在此处查看详细信息:https://datathirst.net/blog/2018/10/12/executing-sql-server-stored-procedures-on-databricks-pyspark

您也可以下拉到 scala 来执行此操作,因为 SQL 服务器 JDBC 驱动程序已经安装。例如:

%scala

import java.util.Properties
import java.sql.DriverManager

val jdbcUsername = "xxxxx"
val jdbcPassword = "xxxxxx"
val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"

// Create the JDBC URL without passing in the user and password parameters.
val jdbcUrl = s"jdbc:sqlserver://xxxxxx.database.windows.net:1433;database=AdventureWorks;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"

// Create a Properties() object to hold the parameters.

val connectionProperties = new Properties()

connectionProperties.put("user", s"${jdbcUsername}")
connectionProperties.put("password", s"${jdbcPassword}")
connectionProperties.setProperty("Driver", driverClass)

val connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)
val stmt = connection.createStatement()
val sql = "delete from sometable where someColumn > 4"

stmt.execute(sql)
connection.close()