在 Athena 中创建表
您可以在 Athena 控制台中、使用 JDBC 或 ODBC 驱动程序,或使用 Athena Create table(创建表)表单运行 DDL 语句。
当您在 Athena 中创建新表架构时,Athena 会将架构存储在数据目录中并在您运行查询时使用它。
Athena 采用称作基于读取的架构的方法,这意味着,架构将在您运行查询时投影到您的数据上。这样就无需加载或转换数据。
Athena 不修改您在 Amazon S3 中存储的数据。
Athena 使用 Apache Hive 定义表和创建在本质上为表的逻辑命名空间的数据库。
当您在 Athena 中创建数据库和表时,只需描述架构和表数据在 Amazon S3 中的位置,以便进行读取时查询。因此,数据库和表与传统关系数据库系统的含义稍有不同,因为数据不与数据库和表的架构定义一起存储。
当您查询时,您会使用标准 SQL 来查询表,此时将读取数据。您可以使用 Apache Hive 文档
最大查询字符串长度为 256 KB。
Hive 通过使用串行器/解串器 (SerDe) 库来支持多种数据格式。您还可以使用正则表达式来定义复杂架构。有关受支持的 SerDe 库的列表,请参阅支持的 SerDes 和数据格式。
注意事项和限制
以下是 Athena 中表的一些重要限制和注意事项。
对 Athena 中的数据和 Simple Storage Service (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 的请求速率。有关更多信息,请参阅请求速率和性能注意事项。
如果您将 AWS Glue CreateTable API 操作或 AWS CloudFormation
AWS::Glue::Table
模板创建用于 Athena 的表,而不指定TableType
属性,然后运行 DDL 查询,如SHOW CREATE TABLE
或者MSCK REPAIR TABLE
,则您将收到错误消息失败:NullPointerException 名称为空
。要纠正该错误,请为 TableInput
TableType
属性指定值,使其作为 AWS GlueCreateTable
API 调用或 AWS CloudFormation 模板的一部分。TableType
可能的值包括EXTERNAL_TABLE
或VIRTUAL_VIEW
。此要求仅适用于使用 AWS Glue
CreateTable
API 操作或AWS::Glue::Table
模板创建表的情形。如果您适用 DDL 语句或 AWS Glue 爬网程序为 Athena 创建表,则TableType
属性将自动定义。
支持的函数
Athena 查询中支持的函数对应于 Trino 和 Presto 中的函数。有关单个函数的信息,请参阅 Trino
不支持事务数据转换
Athena 不支持对表数据执行基于事务的操作(例如,在 Hive 或 Presto 中找到的操作)。有关不支持的关键字的完整列表,请参阅不支持的 DDL。
更改表状态的操作是 ACID
当您创建、更新或删除表时,这些操作保证与 ACID 兼容。例如,如果多个用户或客户端同时尝试创建或更改现有的表,则只有一个会成功。
表为 EXTERNAL
除非是创建 Iceberg 表,否则请始终使用 EXTERNAL
关键字。如果您将没有 EXTERNAL
关键字的 CREATE TABLE
用于非 Iceberg 表,Athena 会发出错误。当您在 Athena 中删除表时,仅删除表元数据;数据将保留在 Amazon S3 中。
使用 AWS Glue 或 Athena 控制台创建表
您可以使用 AWS Glue、“添加表”表单或在 Athena 查询编辑器中运行 DDL 语句,从而在 Athena 中创建表。
使用 AWS Glue 爬网程序创建表
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
在查询编辑器中,选择 Tables and views(表和视图)旁的 Create(创建),然后选择 AWS Glue crawler(爬网程序)。
-
按照 AWS Glue 控制台的 Add crawler(添加爬网程序)页面上的步骤,添加爬网程序。
有关更多信息,请参阅 使用爬网程序添加表。
使用 Athena“创建表”表单创建表
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
在查询编辑器中,选择 Tables and views(表和视图)旁边的 Create(创建),然后选择 S3 bucket data(S3 存储桶数据)。
-
在 Create Table From S3 bucket data(从 S3 存储桶数据创建表)表单中,输入创建表所需的信息,然后选择 Create table(创建表)。有关表单中字段的更多信息,请参阅 在 Athena 控制台中使用表单添加 AWS Glue 表。
使用 Hive DDL 创建表
-
从 Database (数据库) 菜单,选择要为其创建表的数据库。如果您未在
CREATE TABLE
语句中指定数据库,则将在查询编辑器中当前选定的数据库内创建表。 -
在查询编辑器中输入类似以下内容的语句,然后选择 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 "
语句来显示所有列的前 10 行。database_name
"."table_name
" LIMIT 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
-
表属性 – 显示表名称、数据库名称、创建的时间以及表是否包含已加密数据。