从Azure SQL Database读取表到Azure Databricks的方法咨询
将Azure SQL Database表读取到Azure Databricks的方法
前置准备
先确认两件事:
- Azure SQL Database的防火墙规则已经允许Databricks集群访问(可开启“允许Azure服务和资源访问此服务器”,或添加集群的出站IP)
- 你持有SQL DB的有效访问凭证(用户名密码/服务主体信息)
方法一:用Spark JDBC直接连接(最通用)
这是最常用的方式,通过JDBC驱动直接连接SQL DB并读取表数据。
基础用户名密码认证代码示例(Python)
# 替换为你的实际信息 server_name = "jdbc:sqlserver://你的sql-server-name.database.windows.net" database_name = "your-db-name" table_name = "your-target-table" username = "sql-username" password = "sql-password" # 拼接完整JDBC URL jdbc_url = f"{server_name};databaseName={database_name};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" # 读取表数据 df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("user", username) \ .option("password", password) \ .load() # 查看读取结果 df.display()
服务主体认证(生产环境推荐,更安全)
如果使用Azure AD服务主体访问SQL DB,代码调整如下:
# 替换为你的实际信息 server_name = "jdbc:sqlserver://你的sql-server-name.database.windows.net" database_name = "your-db-name" table_name = "your-target-table" tenant_id = "your-tenant-id" client_id = "service-principal-client-id" client_secret = "service-principal-secret" jdbc_url = f"{server_name};databaseName={database_name};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("authentication", "ActiveDirectoryServicePrincipal") \ .option("user", client_id) \ .option("password", client_secret) \ .option("tenantId", tenant_id) \ .load()
方法二:用已配置的Databricks数据源连接
如果你的Databricks工作区已在「数据」页面配置好Azure SQL Database的数据源连接,可直接通过连接名称快速读取:
df = spark.read \ .format("sqlserver") \ .option("dbtable", "your-target-table") \ .option("connectionName", "已配置的数据源名称") \ .load()
性能优化小技巧
- 读取大表时,添加分区参数实现并行读取,提升效率(需指定一个数值型分区列):
df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("user", username) \ .option("password", password) \ .option("partitionColumn", "id") \ # 替换为你的数值型分区列 .option("lowerBound", "1") \ .option("upperBound", "100000") \ .option("numPartitions", "10") \ .load() - 避免硬编码密码/密钥,用Databricks Secrets管理敏感信息,例如:
dbutils.secrets.get(scope="your-secret-scope", key="sql-password")
内容的提问来源于stack exchange,提问作者DiegoOrbezo
相关产品推荐
相关产品推荐

