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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

CREATE TABLE

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

Synopsis

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], ...)] [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 [, ...] ) ]

Parameters

[EXTERNAL]

指定表基于存储在 Amazon S3 中您所指定的 LOCATION 中的底层数据文件。当您创建外部表时,引用的数据必须符合默认格式或您使用 ROW FORMATSTORED ASWITH SERDEPROPERTIES 子句指定的格式。

IF NOT EXISTS

如果已存在名为 table_name 的表,则会导致错误消息被隐藏。

[db_name.]table_name

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

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

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

为要创建的每个列指定名称,以及列的数据类型。列名称不允许除下划线之外的特殊字符 (_)。IFIFIF col_name 从下划线开始,将列名称包含在后台中,例如 `_mycolumn`.

data_type 值可能为以下任一值:

  • BOOLEAN。值为 truefalse.

  • TINYINT。8位已签名 INTEGER 采用两种补体格式,最小值为-2^7,最大值为2^7-1。

  • SMALLINT。16位已签名 INTEGER 采用两种补体格式,最小值为-2^15,最大值为2^15-1。

  • INT。Athena 结合了两个不同的 INTEGER 数据类型实施。在数据定义语言 (DDL) 查询中,Athena 使用 INT 数据类型。在所有其他查询中,Athena 使用 INTEGER 数据类型,其中 INTEGER 以二进制补码格式表示为 32 位有符号值,最小值为 -2^31,最大值为 2^31-1。在 JDBC 驱动程序中,将返回 INTEGER 以确保与业务分析应用程序兼容。

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

  • DOUBLE

  • FLOAT

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

    要将十进制值指定为文字,例如,在查询DDL表达式中选择具有特定小数值的行时,指定 DECIMAL 键入定义,并在查询中列出数字作为文字(单引号),如以下示例所示: decimal_value = DECIMAL '0.12'.

  • CHAR。固定长度字符数据,指定长度在1到255之间,例如 char(10)。有关详细信息,请参阅 CharHive数据类型.

  • VARCHAR。可变长度字符数据,指定长度介于1和65535之间,例如 varchar(10)。有关详细信息,请参阅 VarcharHive数据类型.

  • STRING。单引号中的字符串文字。

    注意

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

  • BINARY(适用于 Parquet 中的数据)

  • 日期和时间类型

  • DATE 以ISO格式显示的日期,例如 YYYY-MM-DD。例如, DATE '2008-09-15'.

  • TIMESTAMP 日期和时间即时进入 java.sql.Timestamp 兼容格式,例如 yyyy-MM-dd HH:mm:ss[.f...]。例如, TIMESTAMP '2008-09-15 03:04:05.324'。此格式使用会话时区。

  • 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维修表 要刷新分区元数据的条目,例如 MSCK REPAIR TABLE cloudfront_logs;。对于不兼容Hive的分区,请使用 ALTER TABLE ADD PARTITION 要加载分区,可以查询数据。

[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

  • INPUTFORMAT 'input_format_classname' OUTPUTFORMAT 'output_format_classname'

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

指定从中创建表的底层数据在 Amazon S3 中的位置。位置路径必须是存储桶名称或存储桶名称以及一个或多个文件夹。如果您使用分区,请指定分区数据的根目录。有关表位置的更多信息,请参阅Amazon S3 中的表位置。有关数据格式和权限的信息,请参阅针对 Athena 中的表和 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'='aws_glue_classification',] property_name=property_value [, ...] ) ]

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

Athena 拥有内置物业, has_encrypted_data。将此属性设置为 true 指明下列指定的基础数据集 LOCATION 已加密。如果省略,并且如果工作组的设置不覆盖客户端设置,则假设 false。如果加密了底层数据时将它省略或设置为 false,则查询会导致错误。有关更多信息,请参阅配置加密选项

要运行ETL作业,AWSGLUE要求您创建一个表格 classification 用于指示AWS胶水的数据类型的属性 csvparquetorcavro,或 json...例如, 'classification'='csv'。如果未指定此属性,ETL作业将失败。随后,您可以使用 AWS Glue 控制台、API 或 CLI 来指定它。有关更多信息,请参阅 AWS Glue 开发人员指南中的将针对 ETL 的 AWS Glue 任务与 Athena 一起使用在 Glue 中编写任务

Examples

CREATE EXTERNAL TABLE IF NOT EXISTS mydatabase.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/';