在 Amazon Redshift 上运行联合查询

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

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

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

开始之前

Workspace requirements:

  • 已为 Unity Catalog 启用工作区。

Compute requirements:

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

Permissions required:

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

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

创建连接

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

Note

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

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

Catalog Explorer

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

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

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

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

  4. 选择 连接类型Redshift

  5. (可选)添加注释。

  6. Click Next.

  7. “身份验证 ”页上,输入 Redshift 实例的以下连接属性。

    • 主机:例如 redshift-demo.us-west-2.redshift.amazonaws.com
    • 端口:例如 5439
    • 用户:例如 redshift_user
    • 密码:例如 password123
  8. (可选) 禁用 SSL 主机名验证

  9. 单击“ 创建连接”。

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

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

  12. 单击“创建目录”。

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

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

  15. 授予对目录的“特权”。 Click Grant:

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

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

  18. (可选)添加注释。

  19. Click Save.

SQL

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

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

建议对敏感值(如凭据)使用 Azure Databricks 机密 ,而不是纯文本字符串。 For example:

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>')
)

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

创建外部目录

Note

如果使用 UI 创建与数据源的连接,则包含外部目录创建,你可以跳过此步骤。

外部目录镜像外部数据系统中的数据库,以便可以使用 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 特权。

Catalog Explorer

  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>');

Supported pushdowns

支持以下下推:

  • Filters
  • Projections
  • Limit
  • Joins
  • 聚合(Average、Count、Max、Min、StddevPop、StddevSamp、Sum、VarianceSamp)
  • 函数(字符串函数和其他杂项函数,例如 Alias、Cast、SortOrder)
  • Sorting

不支持以下下推:

  • Windows functions

数据类型映射

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

Redshift type Spark type
numeric 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 读取时,如果 Timestamp(默认),Redshift TimestampType 将映射到 Spark infer_timestamp_ntz_type = false。 如果 Timestamp,则 Redshift TimestampNTZType 映射到 infer_timestamp_ntz_type = true

Limitations

  • 不能对 Amazon Redshift 外部数据运行联合查询。