在 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 或 S3 Glacier Deep Archive 存储类中的数据。已忽略 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 存储类中的对象。作为替代方法,您可以使用 Amazon S3 Glacier Instant Retrieval 存储类,Athena 可以查询该存储类。有关更多信息,请参阅 Amazon S3 Glacier Instant Retrieval 存储类

    有关存储类的信息,请参阅《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 属性将自动定义。