从 Amazon Redshift 中查询 Amazon S3 表类数据存储服务 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

从补丁 198 开始,Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息,请参阅博客文章

从 Amazon Redshift 中查询 Amazon S3 表类数据存储服务

Amazon Redshift 与 Amazon S3 表存储桶集成,支持您使用 Amazon Redshift 访问 S3 表资源。无论您是刚开始使用,还是在 Iceberg 环境中管理数千个表,表存储桶都可以简化任何规模的数据湖管理。有关更多信息,请参阅 Table Buckets

本主题介绍如何开始使用 Amazon S3 表类数据存储服务和 Redshift 以及如何使用 Amazon Redshift 访问 S3 表类数据存储服务对象。

先决条件

在从 Amazon Redshift 查询 S3 表类数据存储服务之前,必须将 S3 表类数据存储服务与 Amazon Glue Data Catalog 集成。有关说明,请参阅将 Amazon S3 表类数据存储服务与 Amazon Glue Data Catalog 集成

在 S3 表类数据存储服务与 Amazon Glue Data Catalog 集成后,具有所需 S3 表类数据存储服务和 Amazon Glue IAM 权限的 IAM 主体可以通过 Amazon Glue Data Catalog 发现 S3 表类数据存储服务。

注意

方法 3(自动挂载的 awsdatacatalog)还有其它先决条件。有关详细信息,请参阅 方法 3:自动挂载的 awsdatacatalog

从 Amazon Redshift 中查询 S3 表类数据存储服务

要开始查询 S3 表类数据存储服务,请按照以下步骤执行:

  • 步骤 1:为 Amazon Redshift 创建 IAM 角色

  • 步骤 2:将 IAM 角色附加到您的 Amazon Redshift 集群

  • 步骤 3:从 Amazon Redshift 中查询 S3 表类数据存储服务

步骤 1:为 Amazon Redshift 创建 IAM 角色

您的集群需要授权,才能访问 Amazon Glue 中的外部 S3 表类数据存储服务目录。为了提供该授权,Amazon Redshift 使用附加到集群的 IAM 角色。创建具有以下策略权限的 IAM 角色。

注意

在下面的策略和示例中,将 us-west-2 替换为您的 Amazon 区域,并将 111122223333 替换为您的 Amazon 账户 ID。

创建策略:

  1. 打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择策略

  3. 选择创建策略

  4. 选择 JSON 选项卡。

  5. 粘贴以下 JSON 策略文档:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "GlueDataCatalogPermissions", "Effect": "Allow", "Action": [ "glue:GetCatalog", "glue:GetDatabase", "glue:GetTable", "glue:GetTables", "glue:UpdateTable", "glue:DeleteTable" ], "Resource": [ "arn:aws:glue:us-west-2:111122223333:catalog", "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog", "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog/*", "arn:aws:glue:us-west-2:111122223333:database/s3tablescatalog/*/*", "arn:aws:glue:us-west-2:111122223333:table/s3tablescatalog/*/*/*", "arn:aws:glue:us-west-2:111122223333:database/*", "arn:aws:glue:us-west-2:111122223333:table/*/*" ] }, { "Sid": "S3TablesDataAccessPermissions", "Effect": "Allow", "Action": [ "s3tables:GetTableBucket", "s3tables:GetNamespace", "s3tables:GetTable", "s3tables:GetTableMetadataLocation", "s3tables:GetTableData", "s3tables:ListTableBuckets", "s3tables:CreateTable", "s3tables:PutTableData", "s3tables:UpdateTableMetadataLocation", "s3tables:ListNamespaces", "s3tables:ListTables", "s3tables:DeleteTable" ], "Resource": [ "arn:aws:s3tables:us-west-2:111122223333:bucket/*", "arn:aws:s3tables:us-west-2:111122223333:bucket/*/table/*" ] } ] }
  6. 选择查看策略

  7. 查看策略页面上,对于名称,输入 GlueCatalogS3Tables_Policy。(可选)输入描述。查看策略摘要,然后选择创建策略

为 Amazon Redshift 创建 IAM 角色:

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择角色

  3. 选择创建角色

  4. 选择 Amazon 服务作为可信实体,然后选择 Redshift 作为使用案例。

  5. 其它 Amazon 服务的使用案例下,选择 Redshift - 可自定义,然后选择下一步

  6. 添加权限页面上,附加您在上面创建的 GlueCatalogS3Tables_Policy 策略。选择下一步

  7. 对于角色名称,输入您角色的名称,例如 RedshiftS3TablesRole

  8. 审核信息,然后选择创建角色

  9. 在导航窗格中,选择角色。选择新角色的名称以查看摘要,然后将角色 ARN 复制到剪贴板。在为 S3 表类数据存储服务命名空间创建外部架构时,您将使用此 ARN。

注意

通过将通配符替换为确切的 Amazon 资源名称(ARN),将范围缩小到特定资源。

步骤 2:将 IAM 角色附加到您的 Amazon Redshift 集群

将您在步骤 1 中配置的 IAM 角色与 Amazon Redshift 集群相关联。

使用 Amazon 管理控制台:

  1. 登录 Amazon 控制台,并在 https://console.aws.amazon.com/redshiftv2/ 上打开 Amazon Redshift 控制台。

  2. 在导航菜单上,选择 Clusters(集群),然后选择要更新的集群。

  3. 对于操作,选择管理 IAM 角色以显示与集群关联的 IAM 角色的当前列表。

  4. 管理 IAM 角色页面上,选择要添加的 IAM 角色,然后选择添加 IAM 角色

  5. 选择 Done(完成)以保存您的更改。

使用 Amazon CLI:

运行以下命令,以便将 IAM 角色与现有的集群或命名空间相关联。将 my-redshift-clustermy-redshift-namespace 替换为您的集群或命名空间,并将 111122223333 替换为您的 Amazon 账户 ID。

aws redshift modify-cluster-iam-roles \ --cluster-identifier my-redshift-cluster \ --add-iam-roles arn:aws:iam::111122223333:role/RedshiftS3TablesRole -- for serverless aws redshift-serverless update-namespace \ --namespace-name my-redshift-namespace \ --iam-roles "arn:aws:iam::111122223333:role/RedshiftS3TablesRole"

有关更多信息,请参阅《Amazon Redshift 管理指南》中的将 IAM 角色与集群关联

步骤 3:从 Amazon Redshift 中查询 S3 表类数据存储服务

当您将 S3 表类数据存储服务与 Amazon Glue Data Catalog 集成时,该服务会创建一个联合目录结构,来将 S3 表类数据存储服务资源映射到 Amazon Glue 目录对象:

  • S3 表存储桶变为 Amazon Glue Data Catalog 中的目录

  • S3 命名空间变为 Amazon Glue 数据库

  • S3 表变为 Amazon Glue 表对象

集成会创建以下层次结构:

  • 联合目录:s3tablescatalog(自动创建)

  • 子目录:每个 S3 表存储桶都将变为 s3tablescatalog 下的一个子目录。

  • 数据库:表存储桶中的每个 S3 命名空间都变为一个数据库。

  • 表:命名空间中的每个 S3 表都变为一个表。

例如,如果您有一个名为 analytics-bucket 的 S3 表存储桶,其命名空间 sales 包含一个表 transactions,则 Amazon Glue Data Catalog 中的完整路径将为:s3tablescatalog/analytics-bucket/sales/transactions

创建资源链接

在使用以下三种查询方法中的任何一种之前,您必须在 Amazon Glue Data Catalog 中创建资源链接。资源链接可让 Amazon Redshift 通过标准目录引用 S3 表类数据存储服务数据库。

使用 Amazon Glue 控制台:

  1. 通过 https://console.aws.amazon.com/glue/ 打开 Amazon Glue 控制台。

  2. 在导航窗格中,选择数据库

  3. 选择创建,然后选择资源链接

  4. 创建资源链接页面上,提供以下信息:

    • 资源链接名称:输入资源链接的名称(例如 sales_resource_link)。

    • 共享数据库:输入 S3 表类数据存储服务数据库路径(例如 s3tablescatalog/analytics-bucket/sales)。

    • 共享数据库所有者:输入您的 Amazon 账户 ID。

    • 共享数据库的目录 ID:以格式 <account-id>:s3tablescatalog/<bucket-name> 输入目录 ID。

  5. 选择创建

使用 Amazon CLI:

aws glue create-database \ --region us-west-2 \ --cli-input-json '{ "CatalogId": "111122223333", "DatabaseInput": { "Name": "sales_resource_link", "TargetDatabase": { "CatalogId": "111122223333:s3tablescatalog/analytics-bucket", "DatabaseName": "sales" } } }'

此命令在您的默认 Amazon Glue 数据目录中创建一个名为 sales_resource_link 的资源链接,该链接指向 S3 表存储桶 analytics-bucket 中的 sales 数据库。

创建资源链接后,Amazon Redshift 提供三种查询 S3 表类数据存储服务的方法。请选择最适合您的使用案例的方法。

注意

要在数据库级别创建资源链接,Redshift 管理员必须对默认目录和正在创建的数据库拥有 AWS Glue:CreateDatabase 权限。

方法 1:CREATE EXTERNAL SCHEMA

使用 CREATE EXTERNAL SCHEMA 来创建引用 S3 表类数据存储服务数据库的外部架构。此方法提供对架构命名和配置的显式控制。

有关完整的语法详情,请参阅《Amazon Redshift 数据库开发人员指南》中的 CREATE EXTERNAL SCHEMA

示例

使用步骤 3 中的数据库名称和目录 ID。将 111122223333 替换为您的Amazon账户 ID。

CREATE EXTERNAL SCHEMA s3tables_schema FROM DATA CATALOG DATABASE 'sales_resource_link' IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole' REGION 'us-west-2' CATALOG_ID '111122223333'; SELECT * FROM s3tables_schema.transactions;

方法 2:CREATE DATABASE FROM ARN

CREATE DATABASEFROM ARN 子句结合使用,以创建直接引用您的 Amazon Glue 资源链接的联合数据库。此方法自动将 Amazon Glue 数据库映射到 Redshift 数据库。

有关完整的语法详情,请参阅《Amazon Redshift 数据库开发人员指南》中的 CREATE DATABASE

示例

111122223333 替换为您的Amazon账户 ID。

CREATE DATABASE s3tables_db FROM ARN 'arn:aws:glue:us-west-2:111122223333:database/sales_resource_link' WITH DATA CATALOG SCHEMA analytics_schema IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole'; SELECT * FROM s3tables_db.analytics_schema.transactions;

方法 3:自动挂载的 awsdatacatalog

Amazon Redshift 可以通过 awsdatacatalog 数据库自动挂载 Amazon Glue Data Catalog 数据库,包括 S3 表类数据存储服务资源链接。此方法要求在集群上启用对 Spectrum(FAS)的联合访问权限。

先决条件

要使用自动挂载的 awsdatacatalog 数据库,必须启用对 Spectrum 的联合访问权限。这支持 Amazon Redshift 使用联合身份凭证访问 Amazon Glue Data Catalog 和外部数据来源。

启用对 Spectrum 的联合访问权限:

  1. 使用具有以下权限的 IAM 身份连接到您的 Redshift 集群:

    • redshift:GetClusterCredentialsWithIAM(适用于预置集群)或 redshift-serverless:GetCredentials(适用于无服务器)

    • AmazonS3ReadOnlyAccess

    • AWSGlueConsoleFullAccess

    • S3 表类数据存储服务权限(如步骤 1 中所定义)

  2. 当您使用 IAM 身份进行连接时,Amazon Redshift 会自动创建一个以 IAM:(对于用户)或 IAMR:(对于角色)为前缀的数据库用户。

  3. 以集群管理员身份,授予联合用户访问外部架构的权限。将 my_user 替换为 IAM 角色或用户名。

    GRANT ALL ON SCHEMA awsdatacatalog TO "IAMR:my_user";

有关设置联合访问权限的详细说明,请参阅《Amazon Redshift 管理指南》中的使用联合身份管理 Amazon Redshift 对本地资源和 Amazon Redshift Spectrum 外部表的访问权限

查询 S3 表类数据存储服务

配置联合访问权限后,验证已安装的架构并查询 S3 表类数据存储服务。

验证已安装的架构:

SHOW SCHEMAS FROM DATABASE awsdatacatalog;

使用步骤 3 中的资源链接名称查询 S3 表类数据存储服务:

SELECT * FROM awsdatacatalog.sales_resource_link.transactions;