如何使用Scala通过服务主体连接Azure SQL Server
Scala 基于服务主体连接Azure数据库(JDBC方案)
前置依赖
首先需要在项目中引入以下依赖,用于Azure AD令牌生成和SQL Server JDBC连接:
- 令牌生成依赖:
com.microsoft.azure:adal4j:1.6.7(版本可根据实际场景选择适配版) - SQL Server Spark连接器依赖:
com.microsoft.azure:spark-mssql-connector_2.12:1.3.0-BETA(适配Spark 3.x版本,如使用Spark 2.x可选择对应版本) - JDBC驱动依赖:
com.microsoft.sqlserver:mssql-jdbc:9.4.1.jre11
步骤1:生成Azure AD访问令牌
对应你给出的Python实现,Scala侧使用adal4j生成访问令牌的代码如下:
import com.microsoft.aad.adal4j.AuthenticationContext import java.util.concurrent.Executors // 配置参数 val tenantId: String = "<< 你的Azure租户ID >>" // 可在Azure门户的应用注册中获取 val resourceAppIdUrl: String = "https://database.windows.net/" val servicePrincipalId: String = "<< 你的服务主体应用ID >>" val servicePrincipalSecret: String = "<< 你的服务主体密钥 >>" val authority = s"https://login.windows.net/$tenantId" val executorService = Executors.newFixedThreadPool(1) val context = new AuthenticationContext(authority, false, executorService) // 异步获取令牌,同步等待返回结果 val future = context.acquireToken( resourceAppIdUrl, servicePrincipalId, servicePrincipalSecret, null ) val accessToken = future.get().getAccessToken // 关闭线程池 executorService.shutdown()
步骤2:通过Spark JDBC连接Azure数据库
拿到令牌后,即可通过JDBC方式读取数据,逻辑和Python实现完全对齐:
val jdbcUrl: String = "<< 你的Azure数据库JDBC URL,格式为jdbc:sqlserver://<实例名>.database.windows.net:1433;databaseName=<数据库名> >>" val dbtable: String = "<< 要读取的表名,或自定义查询语句 >>" val jdbcDf = spark.read .format("com.microsoft.sqlserver.jdbc.spark") .option("url", jdbcUrl) .option("dbtable", dbtable) .option("accessToken", accessToken) .option("encrypt", "true") .option("hostNameInCertificate", "*.database.windows.net") .load() // 测试读取结果 jdbcDf.show()
注意事项
- 请确保服务主体已经被授予对应Azure数据库的访问权限,否则会出现权限不足的连接报错
- 如果是在Databricks环境运行,无需手动引入上述依赖,Databricks runtime已内置相关组件,可直接使用代码
- 生产环境中不要硬编码服务主体密钥、租户ID等敏感信息,建议通过密钥管理服务存储和读取敏感参数
内容的提问来源于stack exchange,提问作者Haha
相关产品推荐
相关产品推荐

