在 Athena 中创建表 - Amazon Athena

在 Athena 中创建表

要创建表,您可以在 Athena 控制台中运行 DDL 语句,使用 Athena 创建表表单或使用 JDBC 或 ODBC 驱动器。Athena 使用 Apache Hive 定义表和创建在本质上为表的逻辑命名空间的数据库。Athena 支持各种序列化器-反序列化器(SerDe)库来为特定数据格式创建表。有关受支持的 SerDe 库的列表,请参阅为您的数据选择 SerDE

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

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

注意事项和限制

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

Amazon S3 注意事项

创建表时,请使用 LOCATION 子句指定底层数据在 Amazon S3 存储桶中的位置。请考虑以下事项:

  • Athena 只能在版本化的 Amazon S3 存储桶中查询最新版本的数据,并且无法查询以前版本的数据。

  • 您必须拥有权限才能使用 Amazon S3 位置的数据。有关更多信息,请参阅 控制从 Athena 对 Amazon S3 的访问

  • Athena 支持查询使用多个存储类存储在由 LOCATION 子句指定的相同存储桶中的对象。例如,您可以查询存储在 Amazon S3 中不同存储类(标准、标准 IA 和智能分层)的对象中的数据。

  • Athena 支持申请方付款存储桶。要了解如何为包含您计划在 Athena 中查询的源数据的存储桶启用申请方付款,请参阅创建工作组

  • 您可以使用 Athena 查询从 S3 Glacier Flexible Retrieval(以前称为 Glacier)和 S3 Glacier Deep Archive Amazon S3 存储类还原的对象,但您必须针对每个表启用该功能。如果您在运行查询之前未在表上启用该功能,Athena 将在查询执行期间跳过该表的所有 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 对象。有关更多信息,请参阅 查询还原的 Amazon S3 Glacier 对象

    有关存储类的信息,请参阅《Amazon Simple Storage Service 用户指南》中的存储类更改 Simple Storage Service(Amazon S3)中的对象的存储类转换为 GLACIER 存储类(对象归档)申请方付款存储桶

  • 如果您针对包含大量对象且数据未分区的 Amazon S3 存储桶发出查询,则此类查询可能影响 Amazon S3 中的 Get 请求速率限制并导致 Amazon S3 异常。为防止错误发生,请将数据分区。另外,考虑调整 Amazon S3 的请求速率。有关更多信息,请参阅请求速率和性能注意事项

有关在 Amazon S3 中指定数据位置的更多信息,请参阅指定 Amazon S3 中的表位置

其他考虑因素

  • 不支持事务数据转换:Athena 不支持对表数据执行基于事务的操作(例如,在 Hive 或 Presto 中找到的操作)。有关不支持的关键字的完整列表,请参阅不支持的 DDL

  • 表上的操作为 ACID:当您创建、更新或删除表时,这些操作保证与 ACID 兼容。例如,如果多个用户或客户端同时尝试创建或更改现有的表,则只有一个会成功。

  • 表是 EXTERNAL:除非是创建 Iceberg 表,否则请始终使用 EXTERNAL 关键字。如果您将没有 EXTERNAL 关键字的 CREATE TABLE 用于非 Iceberg 表,Athena 会发出错误。当您在 Athena 中删除表时,仅删除表元数据;数据将保留在 Amazon S3 中。

  • 最大查询字符串长度:最大查询字符串长度为 256 KB。

  • 如果您将 AWS Glue CreateTable API 操作或 AWS CloudFormation AWS::Glue::Table 模板创建用于 Athena 的表,而不指定 TableType 属性,然后运行 DDL 查询,如 SHOW CREATE TABLE 或者 MSCK REPAIR TABLE,则您将收到错误消息失败:NullPointerException 名称为空

    要纠正该错误,请为 TableInput TableType 属性指定值,使其作为 AWS Glue CreateTable API 调用或 AWS CloudFormation 模板的一部分。TableType 可能的值包括 EXTERNAL_TABLEVIRTUAL_VIEW

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