我们想从azure databricks笔记本连接azure DB,你能帮我们提供示例吗,我看到了很多答案和故事,但我不清楚以下两点。
服务原则 ID 和秘密是什么,我应该在哪里获取它,如果我们有 AD 访问权限,我应该向我的管理员告知什么以启用此功能。
我们可以在azure门户中获取以上两点。
下面的堆栈溢出参考没有任何答案。
根据上面的链接,下面的代码可用,如何使用秘密凭证来使用它。
注意:我的要求是azure databricks,我们有新的作业集群,它 不是全职工作集群。我们必须在需要时使用我们的 作业集群将启动和停止。
感谢@数据沼泽。优秀的文档 以下方法将帮助您连接到 Azure SQL 数据库。
第1步: 您需要安装 SQL Spark Connector 和 适用于 Python 的 Microsoft Azure Active Directory 身份验证库。
在 databricks 集群中安装来自 Maven 的 com.microsoft.azure:spark-mssql-connector_2.12_3.0:1.0.0-alpha 以及来自 PyPI 的 adal。
在密钥保管库中,生成代表应用程序注册中的值的机密。
客户端 ID 和 客户端密钥
为您的客户端 ID、密钥和租户 ID 创建密钥范围。 了解更多如何在databricks中创建Secretscope
第2步:在数据库中创建用户(SPN),然后授予对象权限。
CREATE USER [thedataswamp-dbr-dev] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA=[dbo]
GO
GRANT SELECT ON SCHEMA :: dbo TO [thedataswamp-dbr-dev];
表:
CREATE TABLE Emperor (
Id INT,
Emperor NVARCHAR(25)
)
INSERT INTO dbo.Emperor (Id, Emperor)
VALUES (1, 'Augustus'),
(2, 'Tiberius'),
(3, 'Caligula'),
(4, 'Claudius'),
(4, 'Nero');
第 3 步: 连接到 Azure SQL 数据库:
从 Key Vault 检索服务主体、机密和租户 ID。 数据库 URL、数据库和表
import adal
resource_app_id_url = "https://database.windows.net/"
service_principal_id = dbutils.secrets.get(scope = "defaultScope", key = "DatabricksSpnId")
service_principal_secret = dbutils.secrets.get(scope = "defaultScope", key = "DatabricksSpnSecret")
tenant_id = dbutils.secrets.get(scope = "defaultScope", key = "TenantId")
authority = "https://login.windows.net/" + tenant_id
azure_sql_url = "jdbc:sqlserver://thedataswamp.database.windows.net"
database_name = "dev"
db_table = "dbo.Emperor"
encrypt = "true"
host_name_in_certificate = "*.database.windows.net"
context = adal.AuthenticationContext(authority)
token = context.acquire_token_with_client_credentials(resource_app_id_url, service_principal_id, service_principal_secret)
access_token = token["accessToken"]
emperorDf = spark.read \
.format("com.microsoft.sqlserver.jdbc.spark") \
.option("url", azure_sql_url) \
.option("dbtable", db_table) \
.option("databaseName", database_name) \
.option("accessToken", access_token) \
.option("encrypt", "true") \
.option("hostNameInCertificate", "*.database.windows.net") \
.load()
display(emperorDf)