在 Microsoft SQL Server 上运行联合查询

本文介绍如何设置 Azure Databricks Lakehouse Federation,以便对不受 Azure Databricks 管理的 SQL Server 数据运行联合查询。 若要详细了解 Lakehouse Federation,请参阅“什么是 Lakehouse Federation?”。

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

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

开始之前

工作区要求:

  • 已为 Unity Catalog 启用工作区。

计算要求:

  • 从 Databricks Runtime 群集或 SQL 仓库到目标数据库系统的网络连接。 请参阅 Lakehouse Federation 网络建议
  • Azure Databricks 群集必须使用 Databricks Runtime 13.3 LTS(或更高版本)和共享或单用户访问模式。
  • SQL 仓库必须是专业版,并且必须使用 2023.40 或更高版本。

所需的权限:

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

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

  • 如果你打算使用 OAuth 进行身份验证,请在适用于 Azure Databricks 的 Microsoft Entra ID 中注册应用。 有关详细信息,请参阅以下部分。

(可选)在适用于 Azure Databricks 的 Microsoft Entra ID 中注册应用

如果你要使用 OAuth 进行身份验证,请在创建 SQL Server 连接之前执行此步骤。 要改用用户名和密码进行身份验证,请跳过本部分。

  1. 登录到 Azure 门户。
  2. 在左侧导航栏中,单击“Microsoft Entra ID”
  3. 单击“应用注册”。
  4. 单击“新建注册”。 输入新应用的名称,并将重定向 URI 设置为 https://<workspace-url>/login/oauth/azure.html
  5. 单击“注册”。
  6. 在“Essentials”框中,复制并存储“应用程序(客户端) ID”。 你将使用此值来配置应用程序。
  7. 单击“证书和机密”
  8. 在“客户端密码”选项卡上,单击“新建客户端密码” 。
  9. 输入机密说明和过期时间(默认设置为 180 天)。
  10. 单击“添加” 。
  11. 复制客户端密码的生成值。
  12. 单击“API 权限”
  13. 单击“添加权限”。
  14. 选择“Azure SQL 数据库”,然后单击“委托权限”下的“user_impersonation”
  15. 单击“添加权限”。

创建连接

连接指定用于访问外部数据库系统的路径和凭据。 若要创建连接,可以使用目录资源管理器,或者使用 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. 在“目录”窗格顶部,单击 添加或加号图标“添加”图标,然后从菜单中选择“添加连接”

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

  3. 输入用户友好的连接名称

  4. 选择 SQL Server 的“连接类型”。

  5. 为“身份验证类型”选择“OAuth”或“用户名和密码”

  6. 根据身份验证方法,为 SQL Server 实例输入以下连接属性:

    • 主机:你的 SQL Server。
    • (基本身份验证)端口
    • (基本身份验证)trustServerCertificate:默认为 false。 设置为 true 时,传输层使用 SSL 加密通道并绕过证书链来验证信任。 除非有绕过信任验证的具体需求,否则请将此设置保留为默认值。
    • (基本身份验证)用户
    • (基本身份验证)密码
    • (OAuth) 授权终结点:你的 Azure Entra 授权终结点,采用 https://login.chinacloudapi.cn/<tenant-id>/oauth2/v2.0/authorize 格式
    • (OAuth) 创建的应用的“客户端 ID”值
    • (OAuth) 创建的客户端机密的“客户端机密”值
    • (OAuth) 客户端范围:按原样输入以下值:https://database.chinacloudapi.cn/.default offline_access
    • (OAuth) 系统会提示您登录,以使用 Azure Entra ID 登录。 输入 Azure 用户名和密码。 重定向到连接创建页面后,授权代码被填充到 UI 中。
  7. (可选)单击“测试连接”以确认它是否正常工作。

  8. (可选)添加注释。

  9. 单击“创建”。

注意

(OAuth) 必须可从 Azure Databricks 控制平面 IP 访问 Azure Entra ID OAuth 终结点。 请参阅 Azure Databricks 区域

SQL

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

CREATE CONNECTION <connection-name> TYPE sqlserver
OPTIONS (
  host '<hostname>',
  port '<port>',
  user '<user>',
  password '<password>'
);

建议对凭据等敏感值使用 Azure Databricks 机密而不是纯文本字符串。 例如:

CREATE CONNECTION <connection-name> TYPE sqlserver
OPTIONS (
  host '<hostname>',
  port '<port>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>')
)

有关设置机密的详细信息,请参阅机密管理

创建外部目录

外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。 若要创建外部目录,请使用与已定义的数据源的连接。

要创建外部目录,可以使用目录资源管理器,或在 Azure Databricks 笔记本或 SQL 查询编辑器中使用 CREATE FOREIGN CATALOG SQL 命令。

注意

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

所需的权限:对元存储具有 CREATE CATALOG 权限,并且具有连接的所有权或对连接具有 CREATE FOREIGN CATALOG 权限。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “目录”图标“目录”以打开目录资源管理器。

  2. 在“目录”窗格顶部,单击 添加或加号图标“添加”图标,然后从菜单中选择“添加目录”

    也可在“快速访问”页中单击“目录”按钮,然后单击“创建目录”按钮。

  3. 按照创建目录中的说明创建外部目录。

SQL

在笔记本或 SQL 查询编辑器中运行以下 SQL 命令。 括号中的项是可选的。 替换占位符值替:

  • <catalog-name>:Azure Databricks 中目录的名称。
  • <connection-name>:指定数据源、路径和访问凭据的连接对象
  • <database-name>:要在 Azure Databricks 中镜像为目录的数据库的名称。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (database '<database-name>');

支持的下推

所有计算均支持以下下推:

  • 筛选器
  • 投影
  • 限制
  • 函数:部分,仅适用于筛选器表达式。 (字符串函数、数学函数、数据、时间和时间戳函数以及其他杂项函数,例如 Alias、Cast、SortOrder)

Databricks Runtime 13.3 LTS 及更高版本和 SQL 仓库计算支持下列下推:

  • 聚合
  • 以下布尔运算符:=、<、<=、>、>=、<=>
  • 以下数学函数(在禁用了 ANSI 时不受支持):+、-、*、%、/
  • 以下各类运算符:^、|、~
  • 排序,与限制一起使用时

不支持以下下推:

  • 联接
  • Windows 函数

数据类型映射

从 SQL Server 读取到 Spark 时,数据类型映射如下所示:

SQL Server 类型 Spark 类型
bigint(无符号)、decimal、money、numeric、smallmoney DecimalType
smallint ShortType
int、tinyint IntegerType
bigint(如果有符号) LongType
real FloatType
float DoubleType
char、nchar、uniqueidentifier CharType
nvarchar、varchar VarcharType
text、xml StringType
binary、geography、geometry、image、timestamp、udt、varbinary BinaryType
bit BooleanType
date DateType
datetime、datetime、smalldatetime、time TimestampType/TimestampNTZType

*从 SQL Server 读取时,如果为 preferTimestampNTZ = false(默认),则 SQL Server datetimes 将映射到 Spark TimestampType。 如果为 preferTimestampNTZ = true,则 SQL Server datetimes 将映射到 TimestampNTZType