在 Amazon Redshift 上运行联合查询

重要

此功能目前以公共预览版提供。

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

若要使用 Lakehouse Federation 在 Amazon Redshift 数据库上连接到你的“运行”查询,必须在 Azure Databricks Unity Catalog 元存储中创建以下内容:

  • 在 Amazon Redshift 数据库上运行查询所需的连接
  • 一个外部目录,用于镜像 Unity Catalog 中的 Amazon Redshift 数据库来运行查询,可让你使用 Unity Catalog 查询语法和数据治理工具来管理 Azure Databricks 用户对数据库的访问。

开始之前

工作区要求:

  • 已为 Unity Catalog 启用工作区。

计算要求:

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

所需的权限:

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

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

创建连接

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

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

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。
  2. 在左窗格中,展开“外部数据”菜单,然后选择“连接”。
  3. 单击“创建连接”。
  4. 输入用户友好的连接名称
  5. 选择 Redshift 的“连接类型”。
  6. 输入你的 Redshift 实例的以下连接属性。
    • 主机:例如 redshift-demo.us-west-2.redshift.amazonaws.com
    • 端口:例如 5439
    • 用户:例如 redshift_user
    • 密码:例如 password123
  7. (可选)单击“测试连接”以确认它是否正常工作。
  8. (可选)添加注释。
  9. 单击“创建”。

Sql

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

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

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

CREATE CONNECTION <connection-name> TYPE redshift
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 笔记本或 Databricks SQL 查询编辑器中的 CREATE FOREIGN CATALOG SQL 命令。

所需的权限:对元存储的 CREATE CATALOG 权限以及连接的所有权或对连接的 CREATE FOREIGN CATALOG 特权。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。
  2. 单击“创建目录”按钮。
  3. 在“创建新目录”对话框中,输入目录的名称,然后为“类型”选择“外部”。
  4. 选择针对要镜像为 Unity Catalog 目录数据库提供访问权限的连接
  5. 输入要作为目录镜像的数据库的名称。
  6. 单击“创建”。

Sql

在笔记本或 Databricks 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>');

支持的下推

支持以下下推:

  • 筛选器
  • 投影
  • 限制
  • 联接
  • 聚合(Average、Count、Max、Min、StddevPop、StddevSamp、Sum、VarianceSamp)
  • 函数(字符串函数和其他杂项函数,例如 Alias、Cast、SortOrder)
  • 排序

不支持以下下推:

  • Windows 函数

数据类型映射

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

Redshift 类型 Spark 类型
数字 DecimalType
int2, int4 IntegerType
int8,oid,xid LongType
float4 FloatType
双精度,浮点数8,货币 DoubleType
bpchar, char, character varying, name, super, text, tid, varchar StringType
bytea, geometry, varbyte BinaryType
bit, bool BooleanType
date DateType
tabstime,时间,含时区的时间,timetz,不含时区的时间,含时区的时间戳,时间戳,timestamptz、,含时区的时间戳* TimestampType/TimestampNTZType

*从 Redshift 读取时,如果 infer_timestamp_ntz_type = false(默认),Redshift Timestamp 将映射到 Spark TimestampType。 如果 infer_timestamp_ntz_type = true,则 Redshift Timestamp 映射到 TimestampNTZType