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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Athena 中创建表

您可以在 Athena 控制台中、使用 JDBC 或 ODBC 驱动程序,或使用 Athena Create table(创建表)表单运行 DDL 语句。

当您在 Athena 中创建新表架构时,Athena 会将架构存储在数据目录中并在您运行查询时使用它。

Athena 采用称作基于读取的架构的方法,这意味着,架构将在您运行查询时投影到您的数据上。这样就无需加载或转换数据。

Athena 不修改您在 Amazon S3 中存储的数据。

Athena 使用 Apache Hive 定义表和创建在本质上为表的逻辑命名空间的数据库。

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

当您查询时,您会使用标准 SQL 来查询表,此时将读取数据。您可以使用 Apache Hive 文档查找有关如何创建数据库和表的指导,但下面提供专门针对 Athena 的指导。

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

Hive 通过使用串行器/解串器 (SerDe) 库来支持多种数据格式。您还可以使用正则表达式来定义复杂架构。有关受支持的 SerDe 库的列表,请参阅支持的 SerDes 和数据格式

注意事项和限制

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

对 Athena 中的数据和 Simple Storage Service (Amazon S3) 中的表的要求

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

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

  • 您必须拥有合适的权限才能使用 Amazon S3 位置的数据。有关更多信息,请参阅对 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 Glue CreateTable API 操作或 Amazon CloudFormation AWS::Glue::Table 模板创建用于 Athena 的表,而不指定 TableType 属性,然后运行 DDL 查询,如 SHOW CREATE TABLE 或者 MSCK REPAIR TABLE,则您将收到错误消息失败:NullPointerException 名称为空

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

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

支持的函数

Athena 查询中支持的函数对应于 Trino 和 Presto 中的函数。有关单个函数的信息,请参阅 TrinoPresto 文档中的函数和运算符部分。

不支持事务数据转换

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

更改表状态的操作是 ACID

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

表为 EXTERNAL

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

使用 Amazon Glue 或 Athena 控制台创建表

您可以使用 Amazon Glue、“添加表”表单或在 Athena 查询编辑器中运行 DDL 语句,从而在 Athena 中创建表。

使用 Amazon Glue 爬网程序创建表

  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在查询编辑器中,选择 Tables and views(表和视图)旁的 Create(创建),然后选择 Amazon Glue crawler(爬网程序)。

  3. 按照 Amazon Glue 控制台的 Add crawler(添加爬网程序)页面上的步骤,添加爬网程序。

    有关更多信息,请参阅使用 Amazon Glue 爬虫

使用 Athena“创建表”表单创建表

  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在查询编辑器中,选择 Tables and views(表和视图)旁边的 Create(创建),然后选择 S3 bucket data(S3 存储桶数据)。

  3. Create Table From S3 bucket data(从 S3 存储桶数据创建表)表单中,输入创建表所需的信息,然后选择 Create table(创建表)。有关表单中字段的更多信息,请参阅 使用表单添加表

使用 Hive DDL 创建表

  1. Database (数据库) 菜单,选择要为其创建表的数据库。如果您未在 CREATE TABLE 语句中指定数据库,则将在查询编辑器中当前选定的数据库内创建表。

  2. 在查询编辑器中输入类似以下内容的语句,然后选择 Run Query(运行查询),或者按 Ctrl+ENTER

    CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` Date, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, OS String, Browser String, BrowserVersion String ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$" ) LOCATION 's3://athena-examples-MyRegion/cloudfront/plaintext/';

显示表信息

在 Athena 中创建表后,其名称将显示在左侧的 Tables(表)列表中。要显示有关该表的信息并对其进行管理,在 Athena 控制台中选择表名称旁边的垂直三个点。

  • Preview Table(预览表)– 通过在 Athena 查询编辑器中运行 SELECT * FROM "database_name"."table_name" LIMIT 10 语句来显示所有列的前 10 行。

  • Generate table DDL(生成表 DDL)– 生成 DDL 语句,您可以使用该语句通过在 Athena 查询编辑器中运行 SHOW CREATE TABLE table_name 语句来重新创建表。

  • Load partitions(加载分区)– 在 Athena 查询编辑器中运行 MSCK REPAIR TABLE table_name 语句。仅当表具有分区时,此选项才可用。

  • Insert into editor(插入编辑器)– 将表名称插入当前编辑位置的查询编辑器中。

  • 删除表 – 显示一个确认对话框,询问是否要删除表。如果您同意,请在 Athena 查询编辑器中运行 DROP TABLE table_name 语句。

  • 表属性 – 显示表名称、数据库名称、创建的时间以及表是否包含已加密数据。