다음을 통해 공유

在 Snowflake 上运行联合查询(Microsoft Entra ID)

本页介绍如何设置 Lakehouse 联邦查询系统,以对未由 Azure Databricks 管理的 Snowflake 数据运行联邦查询。 若要了解有关 Lakehouse 联合的更多信息,请参阅 什么是 Lakehouse 联合?

若要使用 Lakehouse Federation 连接到 Snowflake 数据库,必须在 Azure Databricks Unity Catalog 元存储中创建以下内容:

  • 与 Snowflake 数据库的连接。
  • 一个外部目录,它镜像 Unity Catalog 中的 Snowflake 数据库,以便你可使用 Unity Catalog 查询语法和数据治理工具来管理 Azure Databricks 用户对数据库的访问。

本页介绍如何使用 Microsoft Entra ID 作为外部 OAuth 提供程序对 Snowflake 数据运行联合查询。 它将涵盖 U2M(授权码)和 M2M(客户端凭证)流程。

有关其他身份验证方法,请参阅以下页面:

可以使用查询联合或目录联合在 Snowflake 上运行联合查询。

在查询联合中,JDBC 将 Unity 目录查询向下推送到外部数据库。 这非常适合在您的 ETL 管道上进行按需生成报告或概念验证工作。

在目录联合中,Unity 目录查询直接针对文件存储运行。 这种方法对于没有代码调整的增量迁移很有帮助,或者对于那些必须在 Unity Catalog 中注册数据的同时在 Snowflake 中维护一些数据的组织来说,这是一个长期的混合模型。 请参阅 启用 Snowflake 数据目录联邦

在您开始之前

工作区要求:

  • 已为 Unity Catalog 启用工作区。

计算要求:

  • 计算资源与目标数据库系统之间的网络连接。 请参阅 Lakehouse Federation 网络建议
  • Azure Databricks 计算必须使用 Databricks Runtime 13.3 LTS 或更高版本以及 标准专用 访问模式。
  • SQL 仓库必须是专业或无服务器,并且必须使用 2023.40 或更高版本。

所需的权限:

  • 若要创建连接,你必须是元存储管理员或对附加到工作区的 Unity Catalog 元存储具有 CREATE CONNECTION 权限的用户。
  • 若要创建外部目录,你必须对元存储具有 CREATE CATALOG 权限,并且是连接的所有者或对连接具有 CREATE FOREIGN CATALOG 特权。

后面的每个基于任务的部分中都指定了其他权限要求。

Snowflake 中的外部 OAuth 是什么?

外部 OAuth 是一种身份验证方法,可用于使用 OAuth 2.0 访问 Snowflake 的外部服务器。 不是用户或应用程序直接登录到 Snowflake,而是通过 OAuth 提供程序(例如 Okta、Microsoft Entra ID、PingOne)进行身份验证。

然后,OAuth 提供程序会颁发访问令牌,Databricks 向 Snowflake 提供该令牌。 然后,Snowflake 使用配置的安全集成验证令牌的签名和声明,并授予访问权限。

确定 OAuth 流程

若要为 Snowflake 连接器选择正确的 OAuth 流,需要了解两种主要类型:U2M(用户到计算机)和 M2M(计算机到计算机)。

U2M 是一种授权流程,其中应用程序(Azure Databricks)获得代表用户进行操作的权限。 此流是交互式的,这意味着在创建外部连接时,系统会提示用户登录,并且应用程序会收到限定于 用户权限的访问令牌

M2M 是一种非交互式流,当应用程序需要直接访问资源时,无需用户参与。 在此流中,应用程序需要在 OAuth 提供程序中注册一组权限,独立于任何特定用户。

在 Databricks 工作区中, OAuth 是指 U2M 身份验证, OAuth 计算机到计算机 是指 M2M 身份验证。

配置 Microsoft Entra ID

配置 OAuth 资源应用程序

资源应用程序在 Microsoft Entra ID 中表示 Snowflake,并定义客户端可以请求的权限(范围)。

  1. 登录到 Azure 门户
  2. 导航到 Microsoft Entra ID,并记下“概述”部分中的 租户 ID 。 我们将来把此值称为<TENANT_ID>
  3. 展开 “管理 ”下拉列表,导航到 “应用注册”,然后单击“ 新建注册”。
    1. 输入描述性名称,例如“Snowflake OAuth 资源”。
    2. 在“受支持的帐户类型”中选择仅为此组织目录中的帐户(仅默认目录 - 单租户)
    3. 单击“注册”。
  4. 在新建的应用注册的“概述”部分中,请注意应用程序(客户端)ID 值,以后我们会用到它。<RESOURCE_APP_ID>
  5. 在左侧抽屉中选择公开 API,然后单击应用程序 ID URI 旁边的添加。 默认值应为格式 api://<RESOURCE_APP_ID> ,它将充当 OAuth 受众声明。 可以改为设置包含组织域的值,例如 https://yourorg.partner.onmschina.cn/<RESOURCE_APP_ID> (请参阅Microsoft Entra 应用程序的标识符 URI 限制)。 保存最终值,我们将在安全集成设置过程中将其称为<SNOWFLAKE_APPLICATION_ID_URI>
  6. (仅限 U2M)在 “公开 API ”部分中,单击“ 添加范围”。
    1. 请输入以 session:role: 作为前缀的 Snowflake 角色名称,并将其用作范围名称。 例如,session:role:analyst
    2. 选择谁可以同意。
    3. 输入管理员同意显示名称,例如帐户管理员。
    4. 输入管理员同意说明,例如可以管理 Snowflake 帐户。
    5. 最后,单击“ 添加范围”。
  7. (仅限 M2M)导航到 应用角色,然后单击“ 创建应用角色”。
    1. 显示名称:输入名称,它可以匹配角色值,在本例中为 PUBLIC。
    2. 允许的成员类型:选择“应用程序”。
    3. 值:选择范围,我们将使用 session:role:PUBLIC
    4. 说明:输入说明 - 理想情况下,应描述角色提供的访问权限级别。
    5. 要启用此应用角色吗? 选择复选标记,确保你的角色已启用。
    6. 单击“应用”

创建 OAuth 客户端应用程序

客户端应用程序表示将连接到 Snowflake 的客户端(在本例中为 Azure Databricks)。

  1. 再次导航到 应用注册 ,然后单击“ 新建注册”。
    1. 输入描述性名称,例如“Snowflake OAuth 客户端”。
    2. 对于支持的帐户类型,请仅选择此组织目录中的帐户(仅默认目录 - 单租户)。
    3. 单击“注册”。
  2. 在“概述”部分中,复制并保存 “应用程序”(客户端)ID 字段。 在将来设置 Azure Databricks 连接时,此值将被称为<CLIENT_ID>
  3. (仅限 M2M)单击 本地目录中托管应用程序旁边的链接。 在那里,复制并保存 对象 ID 字段中的值。 在今后的步骤中,我们将把它称作 <CLIENT_OBJECT_ID>——在 Snowflake 中需要在客户端和安全集成之间创建映射。
  4. 导航回并展开 “管理 ”下拉列表。 在那里,导航到 证书和机密,然后单击 “新建客户端密码”。
    1. 选择说明,例如 Azure Databricks 客户端机密
    2. 根据您的需求选择机密过期时间。 机密过期后,需要在 Entra 中创建新的机密,并在 Azure Databricks 中更新连接。
    3. 单击下面的 “添加 ”。
    4. 添加后,复制并安全地将值存储在“值”列中 - 离开页面后将无法再次看到该值。 我们将在 Azure Databricks 中创建连接时引用此值 <CLIENT_SECRET>
  5. 导航到 API 权限,然后单击“ 添加权限”。
    1. 转到 组织使用的 API 选项卡。
    2. 搜索在上一部分创建的资源应用,然后单击它。
    3. (仅限 U2M)单击大型 委派权限 按钮,然后在“权限”下选择您在上一步中创建的角色。
    4. (仅限 M2M)单击“大型 应用程序权限 ”按钮,然后在“权限”下选择在上一步中创建的角色。
    5. 单击“添加权限”。
  6. 最后,单击“ 授予默认目录管理员许可”。
  7. (仅限 U2M)最后一步是设置重定向 URI。 从 Azure Databricks 启动 Entra 登录过程时,重定向 URL 会告知 Entra 如果登录成功,请返回哪个 Azure Databricks 页面。
    1. “管理 ”下拉列表中,导航到 “身份验证 ”部分。
    2. 单击“ 添加平台 ”并选择 “Web 应用程序”。
    3. 输入重定向 URI,格式为 https://<YOUR_DATABRICKS_WORKSPACE>/login/oauth/snowflake.html
    4. 单击“ 配置”。

在 Snowflake 中创建安全集成

此步骤在 Snowflake 中配置安全集成,以便它可以安全地与 Entra ID 通信、验证 Entra ID 令牌,并根据与 OAuth 访问令牌关联的角色提供适当的数据访问。

用户与机器交互流程

  1. 以具有角色的用户 ACCOUNTADMIN 身份连接到 Snowflake 帐户。

  2. 运行 CREATE SECURITY INTEGRATION 命令。 例如:

    CREATE SECURITY INTEGRATION <ENTRA_U2M_SECURITY_INTEGRATION_NAME>
    TYPE = EXTERNAL_OAUTH
    ENABLED = TRUE
    EXTERNAL_OAUTH_TYPE = AZURE
    EXTERNAL_OAUTH_ISSUER = 'https://sts.chinacloudapi.cn/<TENANT_ID>/'
    EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://login.chinacloudapi.cn/<TENANT_ID>/discovery/v2.0/keys'
    EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
    EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'email'
    EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'EMAIL_ADDRESS';
    

    该示例使用 电子邮件 映射声明和属性。 这要求 Snowflake 用户电子邮件与 Azure 租户中的电子邮件匹配。

    ALTER USER <SNOWFLAKE_USER> SET EMAIL = '<YOUR_EMAIL>';
    

    可以根据需求使用不同的声明。

机器对机器流

  1. 以具有角色的用户 ACCOUNTADMIN 身份连接到 Snowflake 帐户。

  2. 运行 CREATE SECURITY INTEGRATION 命令。 例如:

    CREATE OR REPLACE SECURITY INTEGRATION <ENTRA_M2M_SECURITY_INTEGRATION_NAME>
    TYPE = EXTERNAL_OAUTH
    ENABLED = TRUE
    EXTERNAL_OAUTH_TYPE = AZURE
    EXTERNAL_OAUTH_ISSUER = 'https://sts.chinacloudapi.cn/<TENANT_ID>/'
    EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://login.chinacloudapi.cn/<TENANT_ID>/discovery/v2.0/keys'
    EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
    EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
    EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name';
    

    需要在 Snowflake 中创建新的非人类用户来表示连接到数据库的客户端。 Snowflake 必须执行此步骤才能验证用户并将其映射到表示 Microsoft Entra ID 中的 Azure Databricks 的客户端应用。

    CREATE OR REPLACE USER <ENTRA_M2M_CLIENT_USER>
    LOGIN_NAME = '<CLIENT_OBJECT_ID>'
    DEFAULT_ROLE = 'PUBLIC';
    

创建连接

连接指定用于访问外部数据库系统的路径和凭据。 若要创建连接,可以使用目录资源管理器,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE CONNECTION SQL 命令。

注释

你还可以使用 Databricks REST API 或 Databricks CLI 来创建连接。 请参阅 POST /api/2.1/unity-catalog/connectionsUnity Catalog 命令

所需的权限:具有 CREATE CONNECTION 特权的元存储管理员或用户。

用户与机器交互流程

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录

  2. 目录窗格顶部,单击Add or plus icon“添加”或“加号”图标,然后从菜单中选择“添加连接”

    或者,在“快速访问”页中,单击“外部数据 >”按钮,转到“连接”选项卡,然后单击“创建连接

  3. 在“设置连接”向导的“连接基本信息”页面上,输入用户友好的连接名称

  4. 选择“Snowflake”的连接类型

  5. 对于 身份验证类型OAuth 请从下拉菜单中进行选择。

  6. (可选)添加注释。

  7. 单击 “下一步”

  8. 输入 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。

      成功登录后,将定向回“设置连接”向导

  9. 单击“ 创建连接”。

  10. “目录基本信息 ”页上,输入外国目录的名称。 外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。

  11. (可选)单击“测试连接”以确认它是否正常工作。

  12. 单击“创建目录”。

  13. “访问 ”页上,选择用户可以在其中访问所创建的目录的工作区。 您可以选择所有工作区均具有访问权限,或单击分配到工作区,选择工作区,然后单击分配

  14. 更改能够管理对目录中所有对象的访问的 所有者 。 开始在文本框中键入主体,然后单击返回的结果中的主体。

  15. 授予对目录的“特权”。 单击“授权”

    1. 指定将有权访问目录中对象的 主体 。 开始在文本框中键入主体,然后单击返回的结果中的主体。
    2. 选择“特权预设”以对每个主体授权。 默认情况下,向所有帐户用户授予 BROWSE
      • 从下拉菜单中选择 “数据读取者 ”,以授予 read 对目录中对象的权限。
      • 从下拉菜单中选择 “数据编辑器”,以向 readmodify 授予目录中对象的权限。
      • 手动选择要授予的权限。
    3. 单击授权
  16. 单击 “下一步”

  17. 在“元数据”页上,指定标记键值对。 有关详细信息,请参阅 将标记应用于 Unity 目录安全对象

  18. (可选)添加注释。

  19. 单击“ 保存”。

机器对机器通讯流 - 目录浏览器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录

  2. 目录窗格顶部,单击Add or plus icon“添加”或“加号”图标,然后从菜单中选择“添加连接”

    或者,在“快速访问”页中,单击“外部数据 >”按钮,转到“连接”选项卡,然后单击“创建连接

  3. 在“设置连接”向导的“连接基本信息”页面上,输入用户友好的连接名称

  4. 选择“Snowflake”的连接类型

  5. 对于 身份验证类型OAuth Machine to Machine 请从下拉菜单中进行选择。

  6. (可选)添加注释。

  7. 单击 “下一步”

  8. 请输入连接所需的身份验证详细信息。

    • 主机:例如 snowflake-demo.east-us-2.azure.snowflakecomputing.com
    • 端口:例如 443
    • 客户端密码:创建安全集成时保存的客户端密码。
    • 客户端 ID:创建安全集成时保存的客户端 ID。
    • OAuth 作用域api://<RESOURCE_APP_ID>/.default
  9. 单击 “下一步”

  10. 输入以下连接的详细信息:

    • Snowflake 仓库:要使用的仓库的名称。
    • 令牌终结点https://login.chinacloudapi.cn/<TENANT_ID>/oauth2/v2.0/token.
  11. 单击“ 创建连接”。

  12. “目录基本信息 ”页上,输入外国目录的名称。 外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。

  13. (可选)单击“测试连接”以确认它是否正常工作。

  14. 单击“创建目录”。

  15. “访问 ”页上,选择用户可以在其中访问所创建的目录的工作区。 您可以选择所有工作区均具有访问权限,或单击分配到工作区,选择工作区,然后单击分配

  16. 更改能够管理对目录中所有对象的访问的 所有者 。 开始在文本框中键入主体,然后单击返回的结果中的主体。

  17. 授予对目录的“特权”。 单击“授权”

    1. 指定将有权访问目录中对象的 主体 。 开始在文本框中键入主体,然后单击返回的结果中的主体。
    2. 选择“特权预设”以对每个主体授权。 默认情况下,向所有帐户用户授予 BROWSE
      • 从下拉菜单中选择 “数据读取者 ”,以授予 read 对目录中对象的权限。
      • 从下拉菜单中选择 “数据编辑器”,以向 readmodify 授予目录中对象的权限。
      • 手动选择要授予的权限。
    3. 单击授权
  18. 单击 “下一步”

  19. 在“元数据”页上,指定标记键值对。 有关详细信息,请参阅 将标记应用于 Unity 目录安全对象

  20. (可选)添加注释。

  21. 单击“ 保存”。

机器对机器流程 - SQL

在笔记本或 Databricks SQL 查询编辑器中运行以下命令。

CREATE CONNECTION <connection-name>
TYPE SNOWFLAKE
OPTIONS (
  host '<hostname>',
  port '443',
  sfWarehouse '<warehouse-name>',
  client_id '<client-id>',
  client_secret '<client-secret>',
  openid_metadata_endpoint '<oidc-metadata-endpoint>',
  oauth_scope 'session:role:PUBLIC'
);

然后,可以通过运行以下命令,使用新连接创建外部目录:

CREATE FOREIGN CATALOG <catalog-name>
USING CONNECTION <connection-name>
OPTIONS (database = '<database>');

区分大小写的数据库标识符

外部目录的 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。
  • 必须可从 Azure Databricks 控制平面 IP 访问 Snowflake OAuth 终结点。 请参阅 Azure Databricks 控制平面中的出站 IP。 Snowflake 支持在安全集成级别配置网络策略,该策略允许使用单独的网络策略,以便从 Azure Databricks 控制平面直接连接到 OAuth 终结点进行授权。
  • 不支持使用代理代理主机代理端口和 Snowflake 角色配置选项。 指定Snowflake 角色作为 OAuth 范围的一部分。