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

CREATE TABLE

使用您指定的名称和参数创建表。

注意

此页面包含摘要参考信息。有关在 Athena 中创建表的更多信息和示例 CREATE TABLE 语句,请参阅在 Athena 中创建表。有关在 Athena 中创建数据库、创建表和在表上运行 SELECT 查询的示例,请参见 开始使用

摘要

CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [WITH SERDEPROPERTIES (...)] [LOCATION 's3://bucket_name/[folder]/'] [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]

参数

EXTERNAL

指定表基于存储在 Amazon S3 中您所指定的 LOCATION 中的底层数据文件。除非是创建 Iceberg 表,否则请始终使用 EXTERNAL 关键字。如果您将没有 EXTERNAL 关键字的 CREATE TABLE 用于非 Iceberg 表,Athena 会发出错误。当您创建外部表时,引用的数据必须符合默认格式或您使用 ROW FORMATSTORED ASWITH SERDEPROPERTIES 子句指定的格式。

[IF NOT EXISTS]

此参数检查是否已存在名称相同的表。如果是,则参数返回 TRUE,然后 Amazon Athena 取消 CREATE TABLE 操作。由于取消发生在 Athena 调用数据目录之前,因此不会发出 Amazon CloudTrail 事件。

[db_name.]table_name

指定要创建的表的名称。可选的 db_name 参数指定表所在的数据库。如果省略,则会采用当前数据库。如果表名称包含数字,请用引号将 table_name 引起来,例如 "table123"。如果 table_name 以下划线开头,请使用反引号,例如 `_mytable`。不支持特殊字符 (下划线除外)。

Athena 表名称不区分大小写;但是,如果您使用 Apache Spark,则 Spark 需要小写表名称。

[ ( col_name data_type [COMMENT col_comment] [, ...] ) ]

为要创建的每个列指定名称,以及列的数据类型。列名称不允许下划线 (_) 以外的特殊字符。如果 col_name 以下划线开头,请将列名称放入反引号内,例如 `_mycolumn`

data_type 值可能为以下任一值:

  • boolean – 值为 truefalse

  • tinyint – 一个 8 位有符号的整数,采用二进制补码格式,最小值为 -2^7,最大值为 2^7-1。

  • smallint – 一个 16 位有符号的整数,采用二进制补码格式,最小值为 -2^15,最大值为 2^15-1。

  • int – 在数据定义语言 (DDL) 查询(如 CREATE TABLE)中,使用 int 关键字来表示整数。在其他查询中,使用关键字 integer,其中 integer 以二进制补码格式表示为 32 位有符号值,最小值为 -2^31,最大值为 2^31-1。在 JDBC 驱动程序中,将返回 integer 以确保与业务分析应用程序兼容。

  • bigint – 一个 64 位有符号的整数,采用二进制补码格式,最小值为 -2^63,最大值为 2^63-1。

  • double – 64 位有符号的双精度浮点数。范围为 4.94065645841246544e-324d 至 1.79769313486231570e+308d,正或负。double 遵循 IEEE 浮点算法标准 (IEEE 754)。

  • float – 32 位有符号的单精度浮点数。范围为 1.40129846432481707e-45 至 3.40282346638528860e+38,正或负。float 遵循 IEEE 浮点算法标准 (IEEE 754)。相当于 Presto 中的 real。在 Athena 中,在 CREATE TABLE 等 DDL 语句中使用 float,在 SELECT CAST 等 SQL 函数中使用 real。Amazon Glue 爬网程序以 float 返回值, Athena 将内部翻译 realfloat 类型(请参阅 2018 年 6 月 5 日 发布说明)。

  • decimal [ (precision, scale) ],其中 precision 是总位数,而 scale(可选)是小数部分的位数,默认值为 0。例如,使用以下类型定义:decimal(11,5)decimal(15)。最大精度值为 38,最大标度值为 38。

    要将十进制值指定为文字(例如在查询 DDL 表达式中选择具有特定十进制值的行时),请指定 decimal 类型定义,并在查询中将十进制值列为文字(带单引号),如下例所示:decimal_value = decimal '0.12'

  • char – 固定长度字符数据,具有介于 1 和 255 之间的指定长度,例如 char(10)。有关更多信息,请参阅 CHAR Hive 数据类型

  • varchar – 可变长度字符数据,具有介于 1 和 65535 之间的指定长度,例如 varchar(10)。有关更多信息,请参阅 VARCHAR Hive 数据类型

  • string – 用单引号或双引号括起的字符串文本。

    注意

    在 Athena 中,无法将非字符串数据类型强制转换为 string;而是将这些数据类型强制转换为 varchar

  • binary –(适用于 Parquet 中的数据)

  • date – ISO 格式的日期,例如 YYYY-MM-DD。例如,date '2008-09-15'。OpenCSVSerDe 是一个例外,它使用自 1970 年 1 月 1 日以来经过的天数。有关更多信息,请参阅 用于处理 CSV 的 OpenCSVSerDe

  • timestamp – 使用 java.sql.Timestamp 兼容格式的瞬间日期和时间最多可达毫秒级的最大分辨率,例如 yyyy-MM-dd HH:mm:ss[.f...]。例如,timestamp '2008-09-15 03:04:05.324'。OpenCSVSerDe 是一个例外,它使用UNIX 数字格式的 TIMESTAMP 数据(例如 1579059880000)。有关更多信息,请参阅 用于处理 CSV 的 OpenCSVSerDe

  • array < data_type >

  • map < primitive_type, data_type >

  • struct< col_name : data_type [comment col_comment] [, ...]>

[COMMENT table_comment]

创建 comment 表属性并用您指定的 table_comment 填充它。

[PARTITIONED BY (col_name data_type [ COMMENT col_comment ], ... ) ]

使用指定了 col_namedata_typecol_comment 的一个或多个分区列创建分区表。一个表可以有一个或多个分区,这些分区由多个不同的列名称和值组合组成。将会为每个指定的组合创建一个单独的数据目录,这在某些情况下可提高查询性能。已分区列在表数据本身中不存在。如果您将与表列相同的某个值用于 col_name,则会产生错误。有关更多信息,请参阅分区数据

注意

在您创建具有分区的表后,请运行后续查询,其中包含 MSCK REPAIR TABLE 子句用以刷新分区元数据,例如,MSCK REPAIR TABLE cloudfront_logs;。对于不兼容 Hive 的分区,请使用 ALTER TABLE ADD PARTITION 加载分区,以便您可以查询数据。

[CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]

在使用分区或不使用分区的情况下,将指定 col_name 列中的数据分成名为存储桶的数据子集。num_buckets 参数指定要创建的存储桶数量。分桶可以提高对大型数据集的某些查询的性能。

[ROW FORMAT row_format]

指定表及其底层源数据 (如果适用) 的行格式。对于 row_format,您可以使用 DELIMITED 子句指定一个或多个分隔符,或者如下所述使用 SERDE 子句。如果省略 ROW FORMAT 或指定 ROW FORMAT DELIMITED,则会使用本机 SerDe。

  • [DELIMITED FIELDS TERMINATED BY char [ESCAPED BY char]]

  • [DELIMITED COLLECTION ITEMS TERMINATED BY char]

  • [MAP KEYS TERMINATED BY char]

  • [LINES TERMINATED BY char]

  • [NULL DEFINED AS char]

    仅当使用 Hive 0.13 且 STORED AS 文件格式为 TEXTFILE 时才可用。

--OR--

  • SERDE 'serde_name' [WITH SERDEPROPERTIES ("property_name" = "property_value", "property_name" = "property_value" [, ...] )]

    serde_name 指示要使用的 SerDe。WITH SERDEPROPERTIES 子句能让您提供 SerDe 允许的一个或多个自定义属性。

[STORED AS file_format]

为表数据指定文件格式。如果省略,则 TEXTFILE 是默认值。file_format 的选项是:

  • SEQUENCEFILE

  • TEXTFILE

  • RCFILE

  • ORC

  • PARQUET

  • AVRO

  • ION

  • INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

[LOCATION 's3://bucket_name/[folder]/']

指定从中创建表的底层数据在 Amazon S3 中的位置。位置路径必须是存储桶名称或存储桶名称以及一个或多个文件夹。如果您使用分区,请指定分区数据的根目录。有关表位置的更多信息,请参阅Amazon S3 中的表位置。有关数据格式和权限的信息,请参阅 对 Athena 中的数据和 Simple Storage Service (Amazon S3) 中的表的要求

为您的文件夹或存储桶使用尾部斜杠。请勿使用文件名或 glob 字符。

使用:

s3://mybucket/

s3://mybucket/folder/

s3://mybucket/folder/anotherfolder/

请勿使用:

s3://path_to_bucket

s3://path_to_bucket/*

s3://path_to-bucket/mydatafile.dat

[TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['classification'='classification_value',] property_name=property_value [, ...] ) ]

除预定义的表属性外,还指定表定义的自定义元数据键-值对,例如 "comment"

has_encrypted_data – Athena 有一个内置属性 has_encrypted_data。将此属性设置为 true 以指示 LOCATION 指定的底层数据集是加密的。如果省略,并且如果工作组的设置不覆盖客户端设置,则假设 false。如果加密了底层数据时将它省略或设置为 false,则查询会导致错误。有关更多信息,请参阅 静态加密

classification – 在 CloudTrail 控制台中为 Athena 创建的表将 cloudtrail 添加为 classification 属性的值。为运行 ETL 任务,Amazon Glue 要求您创建一个具有 classification 属性的表来将 Amazon Glue 的数据类型指示为 csvparquetorcavrojson。例如,'classification'='csv'。如果您不指定此属性,则 ETL 任务将会失败。随后,您可以使用 Amazon Glue 控制台、API 或 CLI 来指定它。有关更多信息,请参阅 将 Amazon Glue ETL 任务与 Athena 结合使用和《Amazon Glue 开发人员指南》中的在 Amazon Glue 中编写任务

compression_levelcompression_level 属性指定了要使用的压缩级别。此属性仅适用于 ZSTD 压缩。可能的值介于 1 和 22 之间。默认值为 3。有关更多信息,请参阅 在 Athena 中使用 ZSTD 压缩级别

有关其他表属性的更多信息,请参阅 ALTER TABLE SET TBLPROPERTIES

有关创建表的更多信息,请参阅 在 Athena 中创建表