【问题标题】:How to run SQL statement from Databricks cluster如何从 Databricks 集群运行 SQL 语句
【发布时间】:2023-03-31 21:25:01
【问题描述】:

我有一个处理各种表的 Azure Databricks 集群,然后作为最后一步,我将这些表推送到 Azure SQL Server 以供其他进程使用。我在数据块中有一个单元格,看起来像这样:

def generate_connection():
  jdbcUsername = dbutils.secrets.get(scope = "Azure-Key-Vault-Scope", key = "AzureSqlUserName")
  jdbcPassword = dbutils.secrets.get(scope = "Azure-Key-Vault-Scope", key = "AzureSqlPassword")
  connectionProperties = {
    "user" : jdbcUsername,
    "password" : jdbcPassword,
    "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver"
  }
  return connectionProperties

def generate_url():
  jdbcHostname = dbutils.secrets.get(scope = "Azure-Key-Vault-Scope", key = "AzureSqlHostName")
  jdbcDatabase = dbutils.secrets.get(scope = "Azure-Key-Vault-Scope", key = "AzureSqlDatabase")
  jdbcPort = 1433
  return "jdbc:sqlserver://{0}:{1};database={2}".format(jdbcHostname, jdbcPort, jdbcDatabase)


def persist_table(table, sql_table, mode):
  jdbcUrl = generate_url();
  connectionProperties = generate_connection()
  table.write.jdbc(jdbcUrl, sql_table, properties=connectionProperties, mode=mode)

persist_table(spark.table("Sales.OpenOrders"), "Sales.OpenOrders", "overwrite")
persist_table(spark.table("Sales.Orders"), "Sales.Orders", "overwrite")

这按预期工作。我遇到的问题是 Orders 表非常大,每天只有一小部分行可能更改,所以我想要做的是将覆盖模式更改为附加模式并将数据框从整个表只包含可能已更改的行。所有这一切我都知道如何轻松完成,但我想做的是针对 Azure SQL 数据库运行一个简单的 SQL 语句,以删除已经存在的行,以便将它们可能更改的行插入回来.

我想针对 Azure SQL 数据库运行一条 SQL 语句,例如

Delete From Sales.Orders Where CreateDate >= '01/01/2019'

【问题讨论】:

  • 您应该能够使用 %sql 魔法在单元格中运行 SQL 语句。
  • 不,我不想在集群上运行那个 sql 我想在远程 sql 服务器上运行它

标签: sql-server azure databricks azure-databricks


【解决方案1】:

我想分享我的发现。

1) pyodbc - 我问过微软技术支持,得到的答案如下:

####========================================================
### cell 1: install pyodbc
####========================================================
%sh
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
apt-get update
ACCEPT_EULA=Y apt-get install msodbcsql17
apt-get -y install unixodbc-dev
sudo apt-get install python3-pip -y
pip3 install --upgrade pyodbc

####========================================================
### cell 2: connect
####========================================================
import pyodbc

conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};'
                       'SERVER=xxxxx.database.windows.net;'
                       'DATABASE=xxxxx;UID=xxxxx;'
                       'PWD=xxxxx')

####========================================================
### cell 3: create table
####========================================================
conn.execute('CREATE TABLE dbo.Bob (Bob1 VARCHAR(30), Bob2 VARCHAR(30))')

####========================================================
### cell 4: insert into table
####========================================================
conn.execute('INSERT INTO dbo.Bob (Bob1, Bob2) VALUES (?, ?)', ('A', 'B'))

注意事项: a) 运行时:6.2(Scala 2.11、Spark 2.4.4) b) 此运行时版本仅支持 Python 3。

2) Spark connector for Azure SQL Database and SQL Server - 在谷歌搜索安装 pyodbc 的解决方案时,我找到了这个。我更喜欢这个,我会尝试一下。

【讨论】:

    【解决方案2】:

    您需要使用 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')
    
    # Example doing a simple execute
    conn.execute('INSERT INTO Bob (Bob1, Bob2) VALUES (?, ?)', ('A', 'B'))
    

    不幸的是,让它在数据块上工作有点痛苦。不久前我写了一篇博客文章,应该会有所帮助。 https://datathirst.net/blog/2018/10/12/executing-sql-server-stored-procedures-on-databricks-pyspark

    【讨论】:

    • 嗨,伙计,尝试了这个,但收到file not found 错误 - 不确定问题是什么,因为我可以使用 JDBC 连接到我的分贝?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多