

# 教程：S3 表类数据存储服务入门
<a name="s3-tables-getting-started"></a>

在本教程中，您将创建一个表存储桶，并将您区域中的表存储桶与 Amazon 分析服务集成。接下来，您将使用 Amazon CLI 在表存储桶中创建第一个命名空间和表。然后，您可以使用 Amazon Lake Formation 授予对表的权限，这样您就可以开始使用 Athena 查询表了。

**提示**  
如果您要将表格数据从通用存储桶迁移到表存储桶，Amazon 解决方案库提供了指导性解决方案来为您提供助力。此解决方案通过将 Amazon Step Functions 和 Amazon EMR 与 Apache Spark 结合使用，自动将在 Amazon Glue Data Catalog 中注册并存储在通用存储桶中的 Apache Iceberg 和 Apache Hive 表移到表存储桶。有关更多信息，请参阅 Amazon 解决方案库中的[将表格数据从 Amazon S3 迁移到 S3 表的指南](https://www.amazonaws.cn/solutions/guidance/migrating-tabular-data-from-amazon-s3-to-s3-tables/)。

**Topics**
+ [步骤 1：创建表存储桶并将其与 Amazon 分析服务集成](#s1-tables-tutorial-create-bucket)
+ [步骤 2：创建表命名空间和表](#s2-tables-tutorial-create-namespace-and-table)
+ [（可选）步骤 3：授予对表的 Lake Formation 权限](#s3-tables-tutorial-create-table)
+ [步骤 4：在 Athena 中使用 SQL 查询数据](#s4-query-tables)

## 步骤 1：创建表存储桶并将其与 Amazon 分析服务集成
<a name="s1-tables-tutorial-create-bucket"></a>

在此步骤中，您使用 Amazon S3 控制台来创建第一个表存储桶。有关创建表存储桶的其它方法，请参阅 [Creating a table bucket](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-tables-buckets-create.html)。

**注意**  
默认情况下，Amazon S3 控制台会自动将表存储桶与 Amazon SageMaker 智能湖仓集成，从而支持 Amazon 分析服务自动发现和访问您的 S3 表类数据存储服务数据。如果您使用 Amazon Command Line Interface（Amazon CLI）、Amazon SDK 或 REST API 以编程方式创建第一个表存储桶，则必须手动完成 Amazon 分析服务集成。有关更多信息，请参阅 [将 Amazon S3 表类数据存储服务与 Amazon 分析服务集成](s3-tables-integrating-aws.md)。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建表存储桶的区域。

1. 在左侧导航窗格中，选择**表存储桶**。

1. 选择**创建表存储桶**。

1. 在**常规配置**下，输入表存储桶的名称。

   表存储桶名称必须满足以下要求：
   + 在当前区域中对于您的 Amazon Web Services 账户是唯一的。
   + 长度必须介于 3 到 63 个字符之间。
   + 只能由小写字母、数字和连字符 (`-`) 组成。
   + 以字母或数字开头和结尾。

   创建表存储桶后，便无法更改其名称。创建表存储桶的 Amazon Web Services 账户拥有该存储桶。有关命名表存储桶的更多信息，请参阅[表存储桶命名规则](s3-tables-buckets-naming.md#table-buckets-naming-rules)。

1. 在**与 Amazon 分析服务集成**部分中，确保选中**启用集成**复选框。

   如果在使用控制台创建第一个表存储桶时选择了**启用集成**，则 Amazon S3 会尝试将表存储桶与 Amazon 分析服务集成。这种集成可让您使用 Amazon 分析服务来访问当前区域中的所有表。有关更多信息，请参阅 [将 Amazon S3 表类数据存储服务与 Amazon 分析服务集成](s3-tables-integrating-aws.md)。

1. 选择 **创建存储桶 **。

## 步骤 2：创建表命名空间和表
<a name="s2-tables-tutorial-create-namespace-and-table"></a>

对于此步骤，可以在表存储桶中创建一个命名空间，然后在该命名空间下创建一个新表。可以使用控制台或 Amazon CLI 创建表命名空间和表。

**重要**  
创建表时，请确保在表名称和表定义中全部使用小写字母。例如，请确保列名称全部为小写。如果表名称或表定义包含大写字母，则 Amazon Lake Formation 或 Amazon Glue Data Catalog 不支持该表。在这种情况下，Amazon Athena 等 Amazon 分析服务将无法看到您的表，即使表存储桶与 Amazon 分析服务集成，也不例外。  
如果表定义包含大写字母，则在 Athena 中运行 `SELECT` 查询时会收到以下错误消息：“GENERIC\$1INTERNAL\$1ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names.”

### 使用 S3 控制台和 Amazon Athena
<a name="s3-tables-tutorial-create-table-console"></a>

以下过程使用 Amazon S3 控制台通过 Amazon Athena 来创建命名空间和表。

**创建表命名空间和表**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**表存储桶**。

1. 在**表存储桶**页面上，选择要在其中创建表的表存储桶。

1. 在表存储桶详细信息页面上，选择**使用 Athena 创建表**。

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

1. 选择**创建命名空间**。

1. 选择**使用 Athena 创建表**。

1. Amazon Athena 控制台将打开，并出现 Athena 查询编辑器。查询编辑器中填充了一个可用于创建表的示例查询。修改此查询，以指定您希望表具有的表名称和列。

1. 修改完查询后，选择**运行**来创建表。

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

### 使用 Amazon CLI
<a name="s3-tables-tutorial-create-table-CLI"></a>

要使用以下 Amazon CLI 示例命令在表存储桶中创建命名空间，然后在该命名空间下使用架构创建新表，请将 `user input placeholder` 值替换为您自己的值。

**先决条件**
+ 将 [https://docs.amazonaws.cn//aws-managed-policy/latest/reference/AmazonS3TablesFullAccess.html](https://docs.amazonaws.cn//aws-managed-policy/latest/reference/AmazonS3TablesFullAccess.html) 策略附加到您的 IAM 身份。
+ 安装 Amazon CLI 版本 2.23.10 或更高版本。有关更多信息，请参阅《Amazon Command Line Interface 用户指南》**中的[安装或更新最新版本的 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html)。

1. 通过运行以下命令，在表存储桶中创建新的命名空间：

   ```
   aws s3tables create-namespace \
   --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \
   --namespace my_namespace
   ```

   1. 通过运行以下命令，确认您的命名空间已成功创建：

     ```
     aws s3tables list-namespaces \
     --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket
     ```

1. 通过运行以下命令，使用表架构创建新表：

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

   对于 `mytabledefinition.json` 文件，请使用以下示例表定义：

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

## （可选）步骤 3：授予对表的 Lake Formation 权限
<a name="s3-tables-tutorial-create-table"></a>

对于此步骤，请向其它 IAM 主体授予对新表的 Lake Formation 权限。这些权限可让除您之外的其它主体使用 Athena 和其它 Amazon 分析服务来访问表存储桶资源。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](grant-permissions-tables.md#grant-lf-table)。如果您是唯一将访问表的用户，则可以跳过此步骤。

1. 打开 Amazon Lake Formation 控制台（网址为 [https://console.amazonaws.cn/lakeformation/](https://console.amazonaws.cn/lakeformation/)），并以数据湖管理员身份登录。有关如何创建数据湖管理员的更多信息，请参阅 [Create a data lake administrator](https://docs.amazonaws.cn/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。

1. 在导航窗格中，选择**数据权限**，然后选择**授予**。

1. 在**授予权限**页面的**主体**下，选择 **IAM 用户和角色**，然后选择您要支持对表运行查询的 IAM 用户或角色。

1. 在 **LF 标签或目录资源**下，选择**命名 Data Catalog 资源**。

1. 根据您是要授予对账户中所有表的访问权限，还是只想授予对您创建的表存储桶中资源的访问权限，执行以下操作之一：
   + 对于**目录**，选择您在集成表存储桶时创建的账户级目录。例如 `111122223333:s3tablescatalog`。
   + 对于**目录**，为表存储桶选择子目录。例如 `111122223333:s3tablescatalog/amzn-s3-demo-table-bucket`。

1. （可选）如果您为表存储桶选择了子目录，请执行以下一项或两项操作：
   + 对于**数据库**，选择您创建的表存储桶命名空间。
   + 对于**表**，请选择您在表存储桶中创建的表，或选择**所有表**。

1. 根据您选择的是目录还是子目录，以及随后选择的是数据库还是表，您可以在目录级别、数据库级别或表级别设置权限。有关 Lake Formation 权限的更多信息，请参阅《Amazon Lake Formation Developer Guide》**中的 [Managing Lake Formation permissions](https://docs.amazonaws.cn/lake-formation/latest/dg/managing-permissions.html)。

   请执行以下操作之一：
   + 对于**目录权限**，请选择 **Super** 来向另一个主体授予对目录的所有权限，或者选择更精细的权限，例如**描述**。
   + 对于**数据库权限**，您不能选择 **Super** 来向另一个主体授予对数据库的所有权限。而是应选择更精细的权限，例如**描述**。
   + 对于**表权限**，请选择 **Super** 来向另一个主体授予对表的所有权限，或者选择更精细的权限，例如**选择**或**描述**。
**注意**  
当您将对数据目录资源的 Lake Formation 权限授予外部账户或直接授予其他账户中的 IAM 主体时，Lake Formation 会使用 Amazon Resource Access Manager (Amazon RAM) 服务共享该资源。如果被授权者账户与授予者账户在同一个组织中，则被授权者立即可以使用共享资源。如果被授权者账户不在同一个组织中，则 Amazon RAM 会向被授权者账户发送邀请，以便其接受或拒绝资源授权。然后，要使共享资源可用，被授权者账户中的数据湖管理员必须使用 Amazon RAM 控制台或 Amazon CLI 接受邀请。有关跨账户数据共享的更多信息，请参阅《Amazon Lake Formation Developer Guide》**中的 [Cross-account data sharing in Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/cross-account-permissions.html)。

1. 选择**授权**。

## 步骤 4：在 Athena 中使用 SQL 查询数据
<a name="s4-query-tables"></a>

可以在 Athena 中使用 SQL 查询表。Athena 对于 S3 表类数据存储服务支持数据定义语言（DDL）、数据操作语言（DML）和数据查询语言（DQL）查询。

您可以从 Amazon S3 控制台或通过 Amazon Athena 控制台访问 Athena 查询。

### 使用 S3 控制台和 Amazon Athena
<a name="s4-query-tables-query-table-s3-console"></a>

以下过程使用 Amazon S3 控制台访问 Athena 查询编辑器，以便您可以使用 Amazon Athena 查询表。

**查询表**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**表存储桶**。

1. 在**表存储桶**页面上，选择包含要查询的表的表存储桶。

1. 在表存储桶详细信息页面上，选择要查询的表名称旁边的选项按钮。

1. 选择**使用 Athena 查询表**。

1. Amazon Athena 控制台打开，Athena 查询编辑器随即出现，其中包含为您加载的示例 `SELECT` 查询。根据您的用例需要修改此查询。

1. 要运行查询，请选择 **Run**（运行）。

### 使用 Amazon Athena 控制台
<a name="s4-query-tables-query-table-athena-console"></a>

**查询表**

1. 从 [https://console.aws.amazon.com/athena/](https://console.amazonaws.cn/athena/home) 打开 Athena 控制台。

1. 查询表。下面是您可以修改的示例查询。确保将 `user input placeholders` 替换为您自己的信息。

   ```
   SELECT * FROM "s3tablescatalog/amzn-s3-demo-table-bucket"."my_namespace"."my_table" LIMIT 10
   ```

1. 要运行查询，请选择 **Run**（运行）。