

# 在 Athena 中创建表
<a name="creating-tables"></a>

要创建表，您可以在 Athena 控制台中运行 DDL 语句，使用 Athena [**创建表**表单](creating-tables-how-to.md#to-create-a-table-using-the-wizard)或使用 JDBC 或 ODBC 驱动器。Athena 使用 Apache Hive 定义表和创建在本质上为表的逻辑命名空间的数据库。Athena 支持各种序列化器-反序列化器（SerDe）库来为特定数据格式创建表。有关受支持的 SerDe 库的列表，请参阅[为您的数据选择 SerDE](supported-serdes.md)。

当您在 Athena 中创建数据库和表时，只需描述架构和表数据在 Amazon S3 中的位置，以便进行读取时查询。Athena 不修改您在 Amazon S3 中存储的数据。因此，数据库和表与传统关系数据库系统的含义稍有不同，因为数据不与数据库和表的架构定义一起存储。

Athena 将架构存储在 AWS Glue Data Catalog 中，并在您使用 SQL 查询表时使用它来读取数据。这种 *schema-on-read* 方法可在您运行查询时将架构投射到您的数据上，从而无需加载或转换数据。

## 注意事项和限制
<a name="creating-tables-considerations-and-limitations"></a>

以下是 Athena 中表的一些重要限制和注意事项。

### Amazon S3 注意事项
<a name="s3-considerations"></a>

创建表时，请使用 `LOCATION` 子句指定底层数据在 Amazon S3 存储桶中的位置。请考虑以下事项：
+ Athena 只能在版本化的 Amazon S3 存储桶中查询最新版本的数据，并且无法查询以前版本的数据。
+ 您必须拥有权限才能使用 Amazon S3 位置的数据。有关更多信息，请参阅 [控制从 Athena 对 Amazon S3 的访问](s3-permissions.md)。
+ Athena 支持查询使用多个存储类存储在由 `LOCATION` 子句指定的相同存储桶中的对象。例如，您可以查询存储在 Amazon S3 中不同存储类（标准、标准 IA 和智能分层）的对象中的数据。
+ Athena 支持[申请方付款存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html)。要了解如何为包含您计划在 Athena 中查询的源数据的存储桶启用申请方付款，请参阅[创建工作组](creating-workgroups.md)。
+ 您可以使用 Athena 查询从 Amazon Glacier Flexible Retrieval（以前称为 Glacier）和 Amazon Glacier Deep Archive [Amazon S3 存储类别](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)还原的对象，但您必须针对每个表启用该功能。如果您在运行查询之前未在表上启用该功能，Athena 将在查询执行期间跳过该表的所有 Amazon Glacier Flexible Retrieval 和 Amazon Glacier Deep Archive 对象。有关更多信息，请参阅 [查询还原的 Amazon Glacier 对象](querying-glacier.md)。

  有关存储类的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[存储类](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html)、[更改 Simple Storage Service（Amazon S3）中的对象的存储类](https://docs.aws.amazon.com/AmazonS3/latest/dev/ChgStoClsOfObj.html)、[转换为 GLACIER 存储类（对象归档）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#before-deciding-to-archive-objects)和[申请方付款存储桶](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)。
+ 如果您针对包含大量对象且数据未分区的 Amazon S3 存储桶发出查询，则此类查询可能影响 Amazon S3 中的 Get 请求速率限制并导致 Amazon S3 异常。为防止错误发生，请将数据分区。另外，考虑调整 Amazon S3 的请求速率。有关更多信息，请参阅[请求速率和性能注意事项](https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html)。

有关在 Amazon S3 中指定数据位置的更多信息，请参阅[指定 Amazon S3 中的表位置](tables-location-format.md)。

### 其他考虑因素
<a name="creating-tables-other-considerations"></a>
+ **不支持事务数据转换**：Athena 不支持对表数据执行基于事务的操作（例如，在 Hive 或 Presto 中找到的操作）。有关不支持的关键字的完整列表，请参阅[不支持的 DDL](unsupported-ddl.md)。
+ **表上的操作为 ACID**：当您创建、更新或删除表时，这些操作保证与 ACID 兼容。例如，如果多个用户或客户端同时尝试创建或更改现有的表，则只有一个会成功。
+ **表是 EXTERNAL**：除非是创建 [Iceberg](querying-iceberg-creating-tables.md) 表，否则请始终使用 `EXTERNAL` 关键字。如果您将没有 `EXTERNAL` 关键字的 `CREATE TABLE` 用于非 Iceberg 表，Athena 会发出错误。当您在 Athena 中删除表时，仅删除表元数据；数据将保留在 Amazon S3 中。
+ **最大查询字符串长度**：最大查询字符串长度为 256 KB。
+ 如果您将 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 模板创建用于 Athena 的表，而不指定 `TableType` 属性，然后运行 DDL 查询，如 `SHOW CREATE TABLE` 或者 `MSCK REPAIR TABLE`，则您将收到错误消息失败：NullPointerException 名称为空。

  要纠正该错误，请为 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性指定值，使其作为 AWS Glue `CreateTable` API 调用或 [CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)的一部分。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

  此要求仅适用于使用 AWS Glue `CreateTable` API 操作或 `AWS::Glue::Table` 模板创建表的情形。如果您适用 DDL 语句或 AWS Glue 爬网程序为 Athena 创建表，则 `TableType` 属性将自动定义。

**Topics**
+ [注意事项和限制](#creating-tables-considerations-and-limitations)
+ [使用 AWS Glue 或 Athena 控制台创建表](creating-tables-how-to.md)
+ [指定 Amazon S3 中的表位置](tables-location-format.md)
+ [显示创建后的表信息](creating-tables-showing-table-information.md)