本页介绍如何设置 Lakehouse 联邦查询系统,以对未由 Azure Databricks 管理的 Snowflake 数据运行联邦查询。 若要了解有关 Lakehouse 联合的更多信息,请参阅 什么是 Lakehouse 联合?
若要使用 Lakehouse Federation 连接到 Snowflake 数据库,必须在 Azure Databricks Unity Catalog 元存储中创建以下内容:
- 与 Snowflake 数据库的连接。
- 一个外部目录,它镜像 Unity Catalog 中的 Snowflake 数据库,以便你可使用 Unity Catalog 查询语法和数据治理工具来管理 Azure Databricks 用户对数据库的访问。
本页介绍如何使用 Microsoft Entra ID 连接到 Snowflake。 有关其他身份验证方法,请参阅以下页面:
在您开始之前
工作区要求:
- 已为 Unity Catalog 启用工作区。
计算要求:
- 计算资源与目标数据库系统之间的网络连接。 请参阅 Lakehouse Federation 网络建议。
- Azure Databricks 计算必须使用 Databricks Runtime 13.3 LTS 或更高版本以及 标准 或 专用 访问模式。
- SQL 仓库必须是专业或无服务器,并且必须使用 2023.40 或更高版本。
所需的权限:
- 若要创建连接,你必须是元存储管理员或对附加到工作区的 Unity Catalog 元存储具有
CREATE CONNECTION
权限的用户。 - 若要创建外部目录,你必须对元存储具有
CREATE CATALOG
权限,并且是连接的所有者或对连接具有CREATE FOREIGN CATALOG
特权。
后面的每个基于任务的部分中都指定了其他权限要求。
配置 Microsoft Entra ID
Microsoft Entra ID 支持两个 OAuth 流,其中 OAuth 客户端可以获取访问令牌:
授权服务器代表用户向 OAuth 客户端授予访问令牌。
授权服务器向 OAuth 客户端授予 OAuth 客户端本身的访问令牌。
对于 Snowflake 联合,Azure Databricks 仅代表用户支持 OAuth。
配置 OAuth 资源应用程序
资源应用程序在 Microsoft Entra ID 中表示 Snowflake,并定义客户端可以请求的权限(范围)。
按照 Snowflake 文档中的 Microsoft Entra ID 中配置 OAuth 资源 。 跳过 OAuth 流的步骤,其中编程客户端自行请求访问令牌。
创建 OAuth 客户端应用程序
客户端应用程序表示将连接到 Snowflake 的客户端(在本例中为 Databricks)。
按照 Snowflake 文档中 Microsoft Entra ID 中创建 OAuth 客户端 。 跳过 OAuth 流的步骤,其中编程客户端自行请求访问令牌。
设置 Azure Databricks 工作区的重定向 URL:
- 在 Azure 门户中,导航到创建的客户端应用程序。
- 展开“ 管理 ”下拉菜单,然后单击“ 身份验证”。
- 在 “重定向 URI 配置”下,单击“
重定向 URI”图标。
- 选择 “Web”,然后输入以下内容:
https://<YOUR_DATABRICKS_WORKSPACE>/login/oauth/snowflake.html
- 单击“ 配置”。
在 Snowflake 中创建安全集成
此步骤在 Snowflake 中配置安全集成,以便它可以安全地与 Entra ID 通信、验证 Entra ID 令牌,并根据与 OAuth 访问令牌关联的用户角色向用户提供适当的数据访问。
以具有角色的用户
ACCOUNTADMIN
身份连接到 Snowflake 帐户。运行
CREATE SECURITY INTEGRATION
命令。 例如:CREATE SECURITY INTEGRATION <your_security_intergration_name> TYPE = EXTERNAL_OAUTH ENABLED = TRUE EXTERNAL_OAUTH_TYPE = AZURE EXTERNAL_OAUTH_ISSUER = 'https://sts.chinacloudapi.cn/<YOUR_TENANT_ID>/' EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://login.chinacloudapi.cn/<YOUR_TENANT_ID>/discovery/v2.0/keys' EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>') -- Use the Application ID URI value from the resource application setup EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'email' EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'EMAIL_ADDRESS' EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE'; -- Include this if you used 'session:role-any' scope
该示例使用 电子邮件 映射声明和属性。 这要求 Snowflake 用户电子邮件与 Azure 租户中的电子邮件匹配:
ALTER USER <SNOWFLAKE_USER> SET EMAIL = '<YOUR_EMAIL>';
可以根据需求使用不同的声明。
创建连接
连接指定用于访问外部数据库系统的路径和凭据。 若要创建连接,可以使用目录资源管理器,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE CONNECTION
SQL 命令。
注释
你还可以使用 Databricks REST API 或 Databricks CLI 来创建连接。 请参阅 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。
所需的权限:具有 CREATE CONNECTION
特权的元存储管理员或用户。
在 Azure Databricks 工作区中,单击
目录。
在目录窗格顶部,单击
“添加”或“加号”图标,然后从菜单中选择“添加连接”。
或者,在“快速访问”页中,单击“外部数据 >”按钮,转到“连接”选项卡,然后单击“创建连接。
在“设置连接”向导的“连接基本信息”页面上,输入用户友好的连接名称。
选择“Snowflake”的连接类型。
对于 身份验证类型,
OAuth
请从下拉菜单中进行选择。(可选)添加注释。
单击 “下一步” 。
输入 Snowflake 仓库的以下身份验证和连接详细信息。
主机:例如
snowflake-demo.east-cn-2.azure.snowflakecomputing.com
端口:例如
443
用户:例如
snowflake-user
授权终结点:
https://login.partner.microsoftonline.cn/<TENANT_ID>/oauth2/v2.0/authorize
客户端密码:创建安全集成时保存的客户端密码。
客户端 ID:创建安全集成时保存的客户端 ID。
OAuth 作用域:
api://<RESOURCE_APP_ID>/.default offline_access
OAuth 提供程序:
使用 Microsoft Entra ID 登录:使用 OAuth 凭据单击并登录到 Snowflake。
成功登录后,将定向回“设置连接”向导。
单击“ 创建连接”。
在 “目录基本信息 ”页上,输入外国目录的名称。 外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。
(可选)单击“测试连接”以确认它是否正常工作。
单击“创建目录”。
在 “访问 ”页上,选择用户可以在其中访问所创建的目录的工作区。 您可以选择所有工作区均具有访问权限,或单击分配到工作区,选择工作区,然后单击分配。
更改能够管理对目录中所有对象的访问的 所有者 。 开始在文本框中键入主体,然后单击返回的结果中的主体。
授予对目录的“特权”。 单击“授权”:
- 指定将有权访问目录中对象的 主体 。 开始在文本框中键入主体,然后单击返回的结果中的主体。
- 选择“特权预设”以对每个主体授权。 默认情况下,向所有帐户用户授予
BROWSE
。- 从下拉菜单中选择 “数据读取者 ”,以授予
read
对目录中对象的权限。 - 从下拉菜单中选择 “数据编辑器”,以向
read
和modify
授予目录中对象的权限。 - 手动选择要授予的权限。
- 从下拉菜单中选择 “数据读取者 ”,以授予
- 单击授权。
单击 “下一步” 。
在“元数据”页上,指定标记键值对。 有关详细信息,请参阅 将标记应用于 Unity 目录安全对象。
(可选)添加注释。
单击“ 保存”。
区分大小写的数据库标识符
外部目录的 database
字段映射到 Snowflake 数据库标识符。 如果 Snowflake 数据库标识符不区分大小写,则会保留在外部目录 <database-name>
中使用的大小写。 但是,如果 Snowflake 数据库标识符区分大小写,则必须用双引号将外部目录 <database-name>
括起来以保留大小写。
例如:
database
转换为DATABASE
"database"
转换为database
"database"""
转换为database"
若要转义双引号,请使用另一个双引号。
"database""
会导致出错,因为双引号未正确进行转义。
有关详细信息,请参阅 Snowflake 文档中的标识符要求。
支持的下推
支持以下下推:
- 过滤 器
- 预测
- 限度
- 加入
- 聚合(Average、Corr、CovPopulation、CovSample、Count、Max、Min、StddevPop、StddevSamp、Sum、VariancePop、VarianceSamp)
- 函数(字符串函数、数学函数、数据、时间和时间戳函数以及其他杂项函数,例如 Alias、Cast、SortOrder)
- Windows 函数(DenseRank、Rank、RowNumber)
- 排序
数据类型映射
从 Snowflake 读取到 Spark 时,数据类型映射如下所示:
Snowflake 类型 | Spark 类型 |
---|---|
decimal、number、numeric | DecimalType |
bigint、byteint、int、integer、smallint、tinyint | 整数类型 |
float、float4、float8 | FloatType |
double、double precision、real | DoubleType |
char、character、string、text、time、varchar | 字符串类型 |
二进制 | 二进制类型 |
布尔 | BooleanType |
日期 | 日期类型 |
datetime、timestamp、timestamp_ltz、timestamp_ntz、timestamp_tz | 时间戳类型 |
局限性
- Microsoft Entra ID 是唯一受支持的外部 OAuth 集成。 不支持其他外部 OAuth 集成,例如 Okta。
- 必须可从 Databricks 控制平面 IP 访问 Snowflake OAuth 终结点。 请参阅从 Azure Databricks 控制平面出站。 Snowflake 支持在安全集成级别配置网络策略,这允许使用单独的网络策略,该策略允许从 Databricks 控制平面直接连接到 OAuth 终结点以进行授权。
- 不支持使用代理、代理主机、代理端口和 Snowflake 角色配置选项。 指定Snowflake 角色作为 OAuth 范围的一部分。