View a markdown version of this page

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

将元数据导出到 S3 表类数据存储服务(预览)

注意

目录元数据导出功能作为预览功能提供。此功能在正式发布之前可能会更改。

概述

您可以将 Amazon Glue Data Catalog 元数据导出到存储在 Amazon S3 表类数据存储服务中的托管目录系统表。当您启用 S3 表类数据存储服务导出时,您的技术和业务元数据将存储在 Amazon 托管的 aws-catalog 表存储桶的只读 Apache Iceberg 表中,因此可以使用 SQL 以及 Amazon 分析服务(如 Amazon Redshift 和 Amazon EMR)对其进行查询。

在 aws-catalog 表存储桶中,系统表位于以下命名空间中:

  • glue:包含 tables 和 table_columns。

  • catalog_metadata:包含 glossaries、glossary_terms、associated_glossary_terms、attachments 和 item_attachments。

目前支持以下系统表:

系统表 包含

tables

Data Catalog 中每个表的技术和业务元数据,例如其名称、数据库、描述、存储位置和格式。

table_columns

每个目录表的列,包括每列的名称、数据类型、描述以及该列是否为分区键。

glossaries

目录中的业务术语表,包括每个术语表的名称、描述和状态。

glossary_terms

术语表中定义的术语,包括每个术语的名称、描述、父术语表和状态。

associated_glossary_terms

术语表术语与资产之间的关联,包括资产标识符和术语表术语标识符。

attachments

在资产级别附加的自定义表单元数据,包括表单类型和附件内容。

item_attachments

附加到资产内各项目(例如各个列)的自定义表单元数据,包括可迭代表单名称、项目名称、表单类型和附件内容。

有关每个表的完整列级架构,请参阅 目录系统表参考。

目录元数据导出的工作原理

启用导出功能后,Data Catalog 会对您现有的目录元数据执行一次性回填,然后在您进行更改时持续更新系统表。新写入或更新的元数据通常会在约 5 分钟内显示在系统表中。

系统表位于 aws-catalog 表存储桶内的 glue 和 catalog_metadata 命名空间中。当您的目录中首次出现某类元数据时,给定的系统表才会显示。例如,如果您启用了导出功能,并且目录仅包含表和数据库,则只能看到与表相关的系统表。术语表系统表将在您创建第一个术语表后显示。

使用 Amazon CLI 启用目录元数据导出

目录元数据导出是账户级别的设置。您可以使用 Amazon CLI 启用或禁用此功能。

先决条件

您使用的 IAM 身份必须具有调用导出配置操作 glue:PutDataCatalogExportConfiguration 和 glue:GetDataCatalogExportConfiguration 以及 s3tables:CreateTable 的权限。有关 S3 表类数据存储服务权限的更多信息,请参阅 Amazon Simple Storage Service 用户指南中的在 S3 表存储桶中创建表。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:PutDataCatalogExportConfiguration", "glue:GetDataCatalogExportConfiguration" ], "Resource": "*" } ] }

S3 表类数据存储服务中的所有数据(包括 Data Catalog 元数据)均默认使用 SSE-S3 加密进行加密。您可以选择使用 Amazon KMS 密钥(SSE-KMS)加密目录导出。如果您选择使用 Amazon KMS 密钥加密,则必须通过采取以下步骤添加额外的权限:

  1. 向 Data Catalog 导出服务主体和 S3 表类数据存储服务维护服务主体授予使用 KMS 密钥(密钥策略)的权限。

  2. 向运行导出的 IAM 主体授予使用 KMS 密钥(身份策略)的权限。

向 Data Catalog 导出服务主体和 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限

要允许 Amazon Glue 导出加密的目录元数据,并对导出的表执行自动表维护(例如压缩和未引用文件移除),必须向以下服务主体授予对您的 KMS 密钥的访问权限:

  • systemtables.catalog.amazonaws.com:将加密的目录元数据导出到 S3 表类数据存储服务。

  • maintenance.s3tables.amazonaws.com:对导出的表执行自动表维护。

Amazon Glue 写入名为 aws-catalog 的 Amazon 托管表存储桶。用于加密 S3 表类数据存储服务导出的 KMS 密钥不需要与用于加密静态 Data Catalog 的 KMS 密钥相同。Amazon Glue 仅支持对称 KMS 密钥。要授予这些服务主体访问权限,您可以使用以下示例密钥策略。在此策略中,向 maintenance.s3tables.amazonaws.com 服务主体授予使用特定 KMS 密钥对 aws-catalog 表存储桶中的表进行加密和解密的权限。有关 S3 表类数据存储服务维护服务主体的更多信息,请参阅 Amazon Simple Storage Service 用户指南 中的 S3 表类数据存储服务 SSE-KMS 加密的权限要求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSystemTablesDescribeKey", "Effect": "Allow", "Principal": { "Service": "systemtables.catalog.amazonaws.com" }, "Action": [ "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowSystemTablesEncryptDecrypt", "Effect": "Allow", "Principal": { "Service": "systemtables.catalog.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3tables:us-east-1:123456789012:bucket/aws-catalog/table/*", "kms:ViaService": "s3.us-east-1.amazonaws.com" } } }, { "Sid": "AllowS3TablesMaintenanceEncryptDecrypt", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3tables:us-east-1:123456789012:bucket/aws-catalog/*" } } } ] }

主体导出所需的 IAM 权限

向运行导出的主体授予以下权限。以下策略授予 IAM 主体使用 glue_catalog_id 加密上下文(值为您的 catalogId)解密特定 Amazon Glue Data Catalog 的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowDescribeKey", "Effect": "Allow", "Action": [ "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowExportOfGlueDataCatalogByCatalogId", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012", "kms:EncryptionContext:glue_catalog_id": "123456789012" } } } ] }

要启用目录元数据导出

  1. 运行以下命令以启用导出:

    aws glue put-data-catalog-export-configuration \ --export-setting ENABLED
  2. 通过运行以下命令确认配置:

    aws glue get-data-catalog-export-configuration

    响应示例:

    { "ExportSetting": "ENABLED", "Status": "ENABLED", "S3TableBucketArn": "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-catalog" }

    随着初始回填的进行,Status 字段会从 ENABLING 转换为 ENABLED。

要禁用目录元数据导出

运行以下命令:

aws glue put-data-catalog-export-configuration \ --export-setting DISABLED

目录系统表参考

所有系统表都位于 aws-catalog 表存储桶内的 glue 或 catalog_metadata 命名空间中。每个表都包含以下系统列:

列 类型 说明

ingestion_time

timestamp

将记录摄取到系统表的时间(UTC)。

schema_version

字符串

表的架构版本标识符。

表

每个目录表包含一行。

列 类型 说明

id

字符串

表的唯一标识符。

catalog_id

字符串

目录标识符。

catalog_name

字符串

目录名称。

update_time

timestamp

上次更新时间戳。

created_time

timestamp

创建时间戳。

created_by_id

字符串

创建表的主体的标识符。

created_by_type

字符串

创建主体的类型。

description

字符串

表描述。

name

字符串

表名称。

namespace

字符串

表的命名空间。

region_name

字符串

Amazon 区域。

tags

map<string, string>

资源标签。

type

字符串

资产类型。

updated_by_id

字符串

上次更新该表的主体的标识符。

updated_by_type

字符串

更新主体的类型。

database_name

字符串

包含该表的数据库。

input_format

字符串

输入格式类。

lake_formation_registration

字符串

Amazon Lake Formation 注册状态。

output_format

字符串

输出格式类。

owner

字符串

表拥有者。

retention

int

保留期。

serde_library

字符串

序列化/反序列化库。

table_data_format

字符串

数据格式。

table_data_location

字符串

数据位置 URI。

table_format

字符串

表格式(例如 Iceberg、Hudi)。

table_type

字符串

表类型。

table_columns

目录表中每列包含一行。

列 类型 说明

id

字符串

assetId#columnName 格式的复合标识符。

asset_id

字符串

父表的标识符。

column_name

字符串

列名称。

description

字符串

列描述。

type

字符串

列数据类型。

is_partition_key

布尔值

此列是否为分区键。

attachments

包含资产级自定义表单附件(资产上的每个附件对应一行)。

列 类型 说明

asset_id

字符串

父资产的标识符。

attachment_name

字符串

附件名称。

form_type_id

字符串

内容的已注册表单类型。

content_json

字符串

以 JSON 编码字符串表示的附件内容。

item_attachments

包含可迭代表单中各项目(例如单个列)的附件。

列 类型 说明

asset_id

字符串

父资产的标识符。

iterable_form_name

字符串

可迭代表单的名称(例如,列)。

item_name

字符串

项目的名称(例如,列名称)。

attachment_name

字符串

附件名称。

form_type_id

字符串

内容的已注册表单类型。

content_json

字符串

以 JSON 编码字符串表示的附件内容。

词汇表

每个术语表对应一行。

列 类型 说明

id

字符串

术语表唯一标识符。

description

字符串

术语表描述。

name

字符串

术语表名称。

status

字符串

状态(ENABLED 或 DISABLED)。

glossary_terms

每个术语表术语对应一行。

列 类型 说明

id

字符串

术语唯一标识符。

glossary_id

字符串

父术语表的标识符。

long_description

字符串

详细的术语描述。

name

字符串

术语名称。

short_description

字符串

简要术语描述。

status

字符串

状态(ENABLED 或 DISABLED)。

associated_glossary_terms

术语表术语与资产之间的每个关联包含一行。

列 类型 说明

asset_id

字符串

术语表术语所关联资产的标识符。

glossary_term_id

字符串

与资产关联的术语表术语的标识符。联接到 glossary_terms 表。

查询目录系统表

在使用 Amazon 分析服务(如 Amazon EMR)查询导出到 S3 表类数据存储服务的目录元数据之前,必须对 Amazon 托管的 aws-catalog 表存储桶启用分析集成,并配置 Amazon Lake Formation 权限。

先决条件

  • 目录元数据导出已启用,状态为 ENABLED。

  • 访问或其他分析服务。

  • 启用导出后等待 5 分钟,数据即可使用。

集成概述

有关将 S3 表类数据存储服务与 Amazon 分析服务集成的详细信息(包括先决条件、IAM 角色配置和分步操作流程),请参阅《Amazon Simple Storage Service 用户指南》中的将 Amazon S3 表类数据存储服务与 Amazon 分析服务集成。

启用 S3 表类数据存储服务导出并设置分析集成后,您可以使用 Amazon 分析服务(如 Amazon Redshift 和 Amazon EMR)查询 Data Catalog 元数据。这使您能够使用标准 SQL 执行元数据审计和分析。

示例查询

列出所有目录表及其数据库和格式

SELECT id, name, database_name, table_format FROM aws_catalog.glue.tables;
查找特定表中包含描述的列

SELECT column_name, type, description FROM aws_catalog.glue.table_columns WHERE asset_id = 'table-id';
将术语表术语与其父术语表联接

SELECT g.name AS glossary_name, t.name AS term_name, t.short_description FROM aws_catalog.catalog_metadata.glossary_terms t JOIN aws_catalog.catalog_metadata.glossaries g ON t.glossary_id = g.id WHERE g.status = 'ENABLED';
查找与特定术语表术语关联的表

SELECT t.name, t.database_name, gt.name AS term_name FROM aws_catalog.glue.tables t JOIN aws_catalog.catalog_metadata.associated_glossary_terms agt ON agt.asset_id = t.id JOIN aws_catalog.catalog_metadata.glossary_terms gt ON gt.id = agt.glossary_term_id WHERE gt.name = 'term-name';
从自定义表单附件中提取字段

SELECT asset_id, attachment_name, json_extract_scalar(content_json, '$.owner') AS data_owner FROM aws_catalog.catalog_metadata.attachments WHERE form_type_id = 'your-form-type-id';