我们理解在Databricks集群中使用pass - through身份验证允许我们从Databricks笔记本访问ADLS。
我们是否可以实现类似的事情Azure SQL DB/Azure Synapse数据库从Databricks笔记本没有明确指定AD用户名/密码?
是的,您可以使用Keyvault的服务原理从Databricks笔记本中实现Azure SQL DB,而无需指定AD用户名/密码。
先决条件:
- 在azure活动目录中->进入app注册,注册app
- 使用密钥库保存应用程序注册的
service principle_id
,secrete
和tenant_id
- 为azure sql提供足够的权限并创建用户。
创建Azure密钥库and秘密作用域→创建范围→输入DNS名称(例如:https://databricks.vault.azure.net/
)和资源ID→转到属性选项卡在Azure门户中使用Azure密钥库,您可以同时获得DNS和资源ID
代码:
import adal
resource_url = "https://database.windows.net/"
service_principal_id = dbutils.secrets.get(scope = "Scope", key = "ClientId")
service_principal_secret = dbutils.secrets.get(scope = "Scope", key = "ClientSecret")
tenant_id = dbutils.secrets.get(scope = "Scope", key = "Tenantid")
authority = "https://login.windows.net/" + tenant_id
jdbc_url = "jdbc:sqlserver://dem12gh.database.windows.net"
database_name = "sqldemo"
db_table = "dbo.Persons"
encrypt = "true"
host_name_in_certificate = "*.database.windows.net"
context = adal.AuthenticationContext(authority)
token = context.acquire_token_with_client_credentials(resource_url, service_principal_id, service_principal_secret)
access_token = token["accessToken"]
Df = spark.read
.format("com.microsoft.sqlserver.jdbc.spark")
.option("url", jdbc_url)
.option("dbtable", db_table)
.option("databaseName", database_name)
.option("accessToken", access_token)
.option("encrypt", "true")
.option("hostNameInCertificate", "*.database.windows.net")
.load()
display(Df)
请参考Daniel Moody的博客