如何在Synapse Analytics Notebook中用PySpark无密码访问专用SQL池
无密码访问Synapse专用SQL池的PySpark方案
针对你的需求,以下是两种安全的无密码访问方案,替代明文JDBC密码的方式:
方案1:使用Azure AD托管标识(推荐)
这是最安全的无密码方式,利用Databricks工作区的系统分配托管标识完成认证访问。
配置权限
- 登录Azure Synapse Studio,进入目标专用SQL池。
- 切换到权限页面,添加Databricks工作区的系统托管标识为SQL用户,授予
SELECT(或业务所需的其他权限)。
Databricks Notebook代码实现
spark = SparkSession.builder.appName("SynapseDemo").getOrCreate() synapse_server = "<synapse_servername>.sql.azuresynapse.net" synapse_db = "<synapse_database>" table_name = "<sql_pool_table>" # 基于Azure AD托管标识认证的JDBC URL jdbc_url = f"jdbc:sqlserver://{synapse_server}:1433;database={synapse_db};authentication=ActiveDirectoryMSI;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;" # 读取目标表数据 df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \ .load() df.show()
方案2:使用Azure AD服务主体+Databricks Secrets
若需使用服务主体,可将凭据存储在Databricks Secrets中避免明文暴露:
准备前置资源与权限
- 在Azure AD创建服务主体,为其授予Synapse专用SQL池的
SELECT权限。 - 在Databricks中创建Secret Scope,存储服务主体的
clientId、clientSecret和tenantId。
- 在Azure AD创建服务主体,为其授予Synapse专用SQL池的
Databricks Notebook代码实现
spark = SparkSession.builder.appName("SynapseDemo").getOrCreate() synapse_server = "<synapse_servername>.sql.azuresynapse.net" synapse_db = "<synapse_database>" table_name = "<sql_pool_table>" # 从Databricks Secrets中读取服务主体凭据 client_id = dbutils.secrets.get(scope="<your-secret-scope>", key="service-principal-client-id") client_secret = dbutils.secrets.get(scope="<your-secret-scope>", key="service-principal-client-secret") tenant_id = dbutils.secrets.get(scope="<your-secret-scope>", key="azure-tenant-id") # 基于Azure AD服务主体认证的JDBC URL jdbc_url = f"jdbc:sqlserver://{synapse_server}:1433;database={synapse_db};authentication=ActiveDirectoryServicePrincipal;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;" df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \ .option("user", client_id) \ .option("password", client_secret) \ .option("tenantId", tenant_id) \ .load() df.show()
关于直接使用spark.sql失败的说明
直接执行spark.sql("SELECT * FROM TableName")需要先将Synapse专用SQL池注册为Databricks的外部数据源,或通过Unity Catalog完成映射:
- 若要使用Spark SQL直接查询,可通过Unity Catalog创建外部表指向Synapse的目标表,之后即可用
spark.sql查询该外部表; - 也可配置Spark Catalog直接指向Synapse,但需要额外的集群配置步骤。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

