创建 Amazon S3 表 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建 Amazon S3 表

Amazon S3 表是表存储桶的子资源。表以 Apache Iceberg 格式存储,以便您通过使用查询引擎和其它支持 Apache Iceberg 的应用程序来处理这些表。Amazon S3 会持续优化表,以有助于降低存储成本并提高分析查询性能。

创建表时,Amazon S3 会自动为表生成仓库位置。仓库位置是一个唯一的 S3 位置,您可以在其中读取和写入与表关联的对象。以下示例显示了仓库位置的格式:

s3://63a8e430-6e0b-46f5-k833abtwr6s8tmtsycedn8s4yc3xhuse1b--table-s3

表具有以下 Amazon 资源名称(ARN)格式:

arn:aws:s3tables:region:owner-account-id:bucket/bucket-name/table/table-id

默认情况下,您可以在表存储桶中创建多达 10000 个表。要请求增加表存储桶或表的配额,请联系 Amazon Web Services 支持

可以使用 Amazon S3 控制台、Amazon S3 REST API、Amazon SDK、Amazon Command Line Interface(Amazon CLI)或连接到表存储桶的查询引擎来创建表。

创建表时,您可以为该表指定加密设置,除非您使用 Athena 创建表。如果您未指定加密设置,则将使用表存储桶的默认设置对表进行加密。有关更多信息,请参阅 为表指定加密

创建表的先决条件

要创建表,首先必须执行以下操作:

  • 创建表存储桶.

  • 在表存储桶中创建命名空间

  • 确保您对 s3tables:CreateTables3tables:PutTableData 具有 Amazon Identity and Access Management(IAM)权限。

  • 注意

    如果您对表使用 SSE-KMS 加密,则需要对 s3tables:PutTableEncryption 拥有权限,并对所选 Amazon KMS 密钥拥有 DescribeKey 权限。此外,您使用的 Amazon KMS 密钥需要向 S3 表类数据存储服务授予执行自动表维护的权限。有关更多信息,请参阅 S3 表类数据存储服务 SSE-KMS 加密的权限要求

有关有效表名称的信息,请参阅表和命名空间的命名规则

重要

创建表时,请确保在表名称和表定义中全部使用小写字母。例如,请确保列名称全部为小写。如果表名称或表定义包含大写字母,则 Amazon Lake Formation 或 Amazon Glue Data Catalog 不支持该表。在这种情况下,Amazon Athena 等 Amazon 分析服务将无法看到您的表,即使表存储桶与 Amazon 分析服务集成,也不例外。

如果表定义包含大写字母,则在 Athena 中运行 SELECT 查询时会收到以下错误消息:“GENERIC_INTERNAL_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names.”

以下过程使用 Amazon S3 控制台通过 Amazon Athena 来创建表。如果您尚未在表存储桶中创建命名空间,则可以在此过程中创建命名空间。在执行以下步骤之前,请确保您已在此区域中将表存储桶与 Amazon 分析服务集成。有关更多信息,请参阅 将 Amazon S3 表类数据存储服务与 Amazon 分析服务结合使用

注意

当您使用 Athena 创建表时,该表将从表存储桶继承默认加密设置。如果要使用不同的加密类型,则需要使用另一种方法创建表。

创建表
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择表存储桶

  3. 表存储桶页面上,选择要在其中创建表的存储桶。

  4. 在存储桶详细信息页面上,选择使用 Athena 创建表

  5. 使用 Athena 创建表对话框中,执行下列操作之一:

    • 创建新的命名空间。选择创建命名空间,然后在命名空间名称字段中输入名称。命名空间名称必须为 1 到 255 个字符,并且在表存储桶中是唯一的。有效字符为 a–z、0–9 和下划线 (_)。命名空间名称的开头不支持使用下划线。

    • 选择 Create namespace (创建命名空间)

    • 指定现有的命名空间。选择指定此表存储桶中的现有命名空间。然后选择从现有命名空间中选择输入现有命名空间名称。如果存储桶中有超过 1000 个命名空间,则当命名空间名称未出现在列表中时,必须输入该名称。

  6. 选择使用 Athena 创建表

  7. Amazon Athena 控制台将打开,并出现 Athena 查询编辑器。目录字段中应填充 s3tablescatalog/,后跟表存储桶的名称,例如 s3tablescatalog/amzn-s3-demo-bucket数据库字段中应填充您之前创建或选择的命名空间。

    注意

    如果您在目录数据库字段中看不到这些值,请确保您已在该区域中将表存储桶与 Amazon 分析服务集成。有关更多信息,请参阅 将 Amazon S3 表类数据存储服务与 Amazon 分析服务结合使用

  8. 查询编辑器中填充了一个可用于创建表的示例查询。修改此查询,以指定您希望表具有的表名称和列。

  9. 修改完查询后,选择运行来创建表。

    注意
    • 如果您在尝试在 Athena 中运行查询时收到错误“权限不足,无法执行查询。主体对指定的资源没有任何权限”,则必须向您授予对于表的必需 Lake Formation 权限。有关更多信息,请参阅 授予对表或数据库的权限

    • 如果您在尝试在 Athena 中运行查询时收到错误“Iceberg 无法访问所请求的资源”,请转到 Amazon Lake Formation 控制台,并确保您已授予自己对您创建的表存储桶目录和数据库(命名空间)的权限。授予这些权限时请勿指定表。有关更多信息,请参阅 授予对表或数据库的权限

    • 如果在 Athena 中运行 SELECT 查询时收到以下错误消息,则此消息是由表名称中或表定义的列名称中具有大写字母而引起的:“GENERIC_INTERNAL_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names.” 确保表名称和列名称全部为小写。

如果表创建取得成功,则新表的名称将显示在 Athena 中的表列表中。当您导航回 Amazon S3 控制台时,刷新列表后,新表将出现在表存储桶的存储桶详细信息页面上的列表中。

此示例展示了如何使用 Amazon CLI 并使用 JSON 指定表元数据,来通过架构创建表。要使用此示例,请将 user input placeholders 替换为您自己的信息。

aws s3tables create-table --cli-input-json file://mytabledefinition.json

对于 mytabledefinition.json 文件,请使用以下示例表定义。要使用此示例,请将 user input placeholders 替换为您自己的信息。

{ "tableBucketARN": "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket", "namespace": "your_namespace", "name": "example_table", "format": "ICEBERG", "metadata": { "iceberg": { "schema": { "fields": [ {"name": "id", "type": "int","required": true}, {"name": "name", "type": "string"}, {"name": "value", "type": "int"} ] } } } }

您可以在连接到表存储桶的受支持的查询引擎中创建表,例如在 Amazon EMR 上的 Apache Spark 会话中。

以下示例说明如何通过 Spark 使用 CREATE 语句创建表,以及如何使用 INSERT 语句或从现有文件中读取数据来添加表数据。要使用此示例,请将 user input placeholders 替换为您自己的信息。

spark.sql( " CREATE TABLE IF NOT EXISTS s3tablesbucket.example_namespace.`example_table` ( id INT, name STRING, value INT ) USING iceberg " )

创建表后,可以将数据加载到表中。从以下方法中进行选择:

  • 使用 INSERT 语句向表中添加数据。

    spark.sql( """ INSERT INTO s3tablesbucket.my_namespace.my_table VALUES (1, 'ABC', 100), (2, 'XYZ', 200) """)
  • 加载现有的数据文件。

    1. 将数据读入 Spark:

      val data_file_location = "Path such as S3 URI to data file" val data_file = spark.read.parquet(data_file_location)
    2. 将数据写入 Iceberg 表:

      data_file.writeTo("s3tablesbucket.my_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()