CTAS 查询的注意事项和限制 - Amazon Athena

CTAS 查询的注意事项和限制

以下章节说明了在 Athena 中使用 CREATE TABLE AS SELECT(CTAS)查询时需注意的考虑因素和限制。

CTAS 查询语法

CTAS 查询语法不同于用于创建表的 CREATE [EXTERNAL] TABLE 语法。请参阅 CREATE TABLE AS

CTAS 查询与视图

CTAS 查询将新数据写入 Amazon S3 中的指定位置,而视图不会写入任何数据。

CTAS 查询结果的位置

如果您的工作组为查询结果位置覆盖客户端设置,则 Athena 会在位置 s3://<workgroup-query-results-location>/tables/<query-id>/ 创建表。要查看为工作组指定的查询结果位置,请查看工作组的详细信息

如果您的工作组不覆盖查询结果位置,则可在 CTAS 查询中使用语法 WITH (external_location ='s3://location/') 来指定 CTAS 查询结果的存储位置。

注意

external_location 属性必须指定一个空位置。CTAS 查询检查存储桶中的路径位置(前缀)是否为空,如果该位置中已有数据,永远不会覆盖这些数据。要再次使用相同的位置,请删除存储桶中键前缀位置的数据。

如果省略 external_location 语法并且未使用工作组设置,则 Athena 会使用查询结果位置的客户端设置,并在位置 s3://<client-query-results-location>/<Unsaved-or-query-name>/<year>/<month/<date>/tables/<query-id>/ 创建表。

查找孤立文件

如果 CTASINSERT INTO 语句失败,则可能会在数据位置留下孤立数据。由于 Athena 在某些情况下不会从存储桶中删除数据或部分数据,您或许会在后续查询中读取这些部分数据。若要查找孤立文件以执行检查或删除操作,您可以使用 Athena 提供的数据清单文件跟踪要写入的文件列表。有关更多信息,请参阅识别查询输出文件DataManifestLocation

已忽略 ORDER BY 子句

在 CTAS 查询中,Athena 会忽略查询的 SELECT 部分中的 ORDER BY 子句。

根据 SQL 规范(ISO 9075 第 2 部分),只有直接包含 ORDER BY 子句的查询表达式才能保证由查询表达式指定的表的行顺序。在任何情况下,SQL 中的表本质上都是无序的,在子查询子句中实施 ORDER BY 会导致查询性能不佳,同时不会生成输出有序。因此,在 Athena CTAS 查询中,无法保证在写入数据时保留 ORDER BY 子句指定的顺序。

用于存储查询结果的格式

如果您未指定数据存储格式,预设情况下,CTAS 查询的结果以 Parquet 格式存储。您可以使用 PARQUETORCAVROJSONTEXTFILE 格式存储 CTAS 结果。CTAS TEXTFILE 格式不支持多字符分隔符。CTAS 查询不需要指定 SerDe 来解释格式转换。请参阅 Example: Writing query results to a different format

压缩格式

GZIP 压缩用于 JSON 和 TEXTFILE 格式的 CTAS 查询结果。对于 Parquet,您可以使用 GZIP 或者 SNAPPY,默认为 GZIP。对于 ORC,您可以使用 LZ4SNAPPYZLIB,或者 ZSTD,默认为 ZLIB。有关指定压缩的 CTAS 示例,请参阅 Example: Specifying data storage and compression formats。有关 Athena 中压缩的更多信息,请参阅 Athena 压缩支持

分区和存储桶限制

您可以对 CTAS 查询的结果数据进行分区和分桶。有关更多信息,请参阅 在 Athena 中进行分区和分桶。使用 CTAS 创建分区表时,Athena 的写入限制为 100 个分区。

在指定目标表的属性的 WITH 子句末尾包括分区和分桶谓词。有关更多信息,请参阅 Example: Creating bucketed and partitioned tables在 Athena 中进行分区和分桶

有关绕过 100 个分区的限制的信息,请参阅使用 CTAS 和 INSERT INTO 绕过 100 分区限制

加密

您可以加密 Amazon S3 中的 CTAS 查询结果,其方法类似于在 Athena 中加密其他查询结果。有关更多信息,请参阅 加密在 Amazon S3 中存储的 Athena 查询结果

预期存储桶拥有者

对于 CTAS 语句,预期存储桶拥有者设置不适用于 Amazon S3 中的目标表位置。预期存储桶拥有者设置仅适用于您为 Athena 查询结果指定的 Amazon S3 输出位置。有关更多信息,请参阅 使用 Athena 控制台指定查询结果位置

数据类型

CTAS 查询的列数据类型与为原始查询指定的类型相同。