You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Synapse Analytics Notebook中用PySpark无密码访问专用SQL池

无密码访问Synapse专用SQL池的PySpark方案

针对你的需求,以下是两种安全的无密码访问方案,替代明文JDBC密码的方式:

方案1:使用Azure AD托管标识(推荐)

这是最安全的无密码方式,利用Databricks工作区的系统分配托管标识完成认证访问。

  1. 配置权限

    • 登录Azure Synapse Studio,进入目标专用SQL池。
    • 切换到权限页面,添加Databricks工作区的系统托管标识为SQL用户,授予SELECT(或业务所需的其他权限)。
  2. 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中避免明文暴露:

  1. 准备前置资源与权限

    • 在Azure AD创建服务主体,为其授予Synapse专用SQL池的SELECT权限。
    • 在Databricks中创建Secret Scope,存储服务主体的clientId、clientSecret和tenantId。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:48:27