

# CREATE TABLE AS
<a name="create-table-as"></a>

创建新表，使用 [SELECT](select.md) 查询的结果填充该表。要创建空表，使用 [CREATE TABLE](create-table.md)。`CREATE TABLE AS` 将 `CREATE TABLE` DDL 语句与 `SELECT` DML 语句结合在一起，因此严格地说同时包含 DDL 和 DML。请注意，尽管 `CREATE TABLE AS` 在这里与其他 DDL 语句分组在一起，但出于服务限额目的，Athena 中的 CTAS 查询仍被视为 DML。有关 Athena 服务限额的信息，请参阅 [服务配额](service-limits.md)。

**注意**  
对于 CTAS 语句，预期存储桶拥有者设置不适用于 Amazon S3 中的目标表位置。预期存储桶拥有者设置仅适用于您为 Athena 查询结果指定的 Amazon S3 输出位置。有关更多信息，请参阅 [使用 Athena 控制台指定查询结果位置](query-results-specify-location-console.md)。

有关超出此参考主题范围的 `CREATE TABLE AS` 其他信息，请参阅 [从查询结果创建表（CTAS）](ctas.md)。

**Topics**
+ [摘要](#synopsis)
+ [CTAS 表属性](#ctas-table-properties)
+ [示例](#ctas-table-examples)

## 摘要
<a name="synopsis"></a>

```
CREATE TABLE table_name
[ WITH ( property_name = expression [, ...] ) ]
AS query
[ WITH [ NO ] DATA ]
```

其中：

**WITH ( property\$1name = expression [, ...] )**  
可选 CTAS 表属性的列表，其中一些属性特定于数据存储格式。请参阅 [CTAS 表属性](#ctas-table-properties)。

**查询**  
用于创建新表的 [SELECT](select.md) 查询。  
如果您计划创建包含分区的查询，请指定 `SELECT` 语句的列列表中最后一个分区列的名称。

**[ WITH [ NO ] DATA ]**  
如果使用 `WITH NO DATA`，则将创建与原始表具有相同架构的新空表。

**注意**  
若要在查询结果输出中包含列标题，可以使用简单的 `SELECT` 查询而不是 CTAS 查询。您可以从查询结果位置检索结果，也可以使用 Athena 控制台直接下载结果。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。

## CTAS 表属性
<a name="ctas-table-properties"></a>

Athena 中的每个 CTAS 表具有可选的 CTAS 表属性列表，您可以使用 `WITH (property_name = expression [, ...] )` 指定。有关使用这些参数的信息，请参阅 [CTAS 查询的示例](ctas-examples.md)。

** `WITH (property_name = expression [, ...], )` **    
 `table_type = ['HIVE', 'ICEBERG']`   
可选。默认为 `HIVE`。指定结果表的表类型  
例如：  

```
WITH (table_type ='ICEBERG')
```  
 `external_location = [location]`   
由于 Iceberg 表不是外部表，因此该属性不适用于 Iceberg 表。要在 CTAS 语句中定义 Iceberg 表的根位置，请使用本节后面所述的 `location` 属性。
可选。Athena 在 Amazon S3 中保存 CTAS 查询的位置。  
例如：  

```
 WITH (external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/')
```
Athena 不会对查询结果使用同一路径两次。如果您手动指定了位置，请确保您指定的 Amazon S3 位置没有任何数据。Athena 从不尝试删除数据。如果您要再次使用相同的位置，请手动删除数据，否则 CTAS 查询将失败。  
如果您运行一个 CTAS 查询，且该查询在[强制执行查询结果位置](workgroups-settings-override.md)的工作组中指定 `external_location`，则查询会失败并出现错误消息。要查看为工作组指定的查询结果位置， [请参阅工作组的详细信息](viewing-details-workgroups.md)。  
如果您的工作组覆盖查询结果位置的客户端设置，则 Athena 会在以下位置创建表：  

```
s3://amzn-s3-demo-bucket/tables/query-id/
```
如果您未使用 `external_location` 属性指定位置，并且工作组未覆盖客户端设置，则 Athena 将使用查询结果位置的[客户端设置](query-results-specify-location-console.md)在以下位置创建表：  

```
s3://amzn-s3-demo-bucket/Unsaved-or-query-name/year/month/date/tables/query-id/
```  
 `is_external = [boolean]`   
可选。表示此表是否为外部表。默认值为 true。对于 Iceberg 表，必须将其设置为 false。  
例如：  

```
WITH (is_external = false)
```  
 `location = [location]`   
对于 Iceberg 表是必需的。指定要根据查询结果创建的 Iceberg 表的根位置。  
例如：  

```
WITH (location ='s3://amzn-s3-demo-bucket/tables/iceberg_table/')
```  
 `field_delimiter = [delimiter]`   
（可选）特定于基于文本的数据存储格式。CSV、TSV 和文本文件中文件的单字符字段分隔符。例如，`WITH (field_delimiter = ',')`。目前，CTAS 查询不支持多字符字段分隔符。如果您未指定字段分隔符，则默认使用 `\001`。  
 `format = [storage_format]`   
CTAS 查询结果的存储格式，例如 `ORC`、`PARQUET`、`AVRO`、`JSON`、`ION` 或 `TEXTFILE`。对于 Iceberg 表，允许使用 `ORC`、`PARQUET` 和 `AVRO` 格式。如果忽略，则默认使用 `PARQUET`。此参数的名称 `format` 必须以小写列出，否则 CTAS 查询将失败。  
例如：  

```
WITH (format = 'PARQUET')
```  
 `bucketed_by = ARRAY[ column_name[,…], bucket_count = [int] ]`   
该属性不适用于 Iceberg 表。对于 Iceberg 表，使用带存储桶转换的分区。
用于分桶存储数据的存储桶数组列表。如果省略，则 Athena 在此查询中不会分桶存储数据。  
 `bucket_count = [int]`   
该属性不适用于 Iceberg 表。对于 Iceberg 表，使用带存储桶转换的分区。
用于分桶存储数据的存储桶编号。如果省略，Athena 不分桶存储数据。例如：  

```
CREATE TABLE bucketed_table WITH (
  bucketed_by = ARRAY[column_name], 
  bucket_count = 30, format = 'PARQUET', 
  external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/'
) AS 
SELECT 
  * 
FROM 
  table_name
```  
 `partitioned_by = ARRAY[ col_name[,…] ]`   
该属性不适用于 Iceberg 表。要将分区转换用于 Iceberg 表，请使用本节后面所述的 `partitioning` 属性。
可选。CTAS 表进行分区所依据的列的数组列表。确认分区列的名称在 `SELECT` 语句的列列表中最后列出。  
 `partitioning = ARRAY[partition_transform, ...]`   
可选。指定要创建的 Iceberg 表的分区。Iceberg 支持多种分区转换和分区演化。下表总结了分区转换。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/create-table-as.html)
例如：  

```
 WITH (partitioning = ARRAY['month(order_date)', 
                            'bucket(account_number, 10)', 
                            'country']))
```  
 `optimize_rewrite_min_data_file_size_bytes = [long]`   
可选。数据优化的特定配置。包含小于指定值的文件以进行优化。默认值为 `write_target_data_file_size_bytes` 的 0.75 倍。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_min_data_file_size_bytes = 402653184)
```  
 `optimize_rewrite_max_data_file_size_bytes = [long]`   
可选。数据优化的特定配置。包含大于指定值的文件以进行优化。默认值为 `write_target_data_file_size_bytes` 的 1.8 倍。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_max_data_file_size_bytes = 966367641)
```  
 `optimize_rewrite_data_file_threshold = [int]`   
可选。数据优化的特定配置。若需要优化的数据文件少于给定阈值，则不会重写这些文件。这将允许积累更多的数据文件以生成更接近目标大小的文件，并跳过不必要的计算以节省成本。默认值为 5。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_data_file_threshold = 5)
```  
 `optimize_rewrite_delete_file_threshold = [int]`   
可选。数据优化的特定配置。如果与数据文件关联的删除文件少于阈值，则不会重写该数据文件。这将允许为每个数据文件累积更多的删除文件，以节省成本。默认值为 2。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_delete_file_threshold = 2)
```  
 `vacuum_min_snapshots_to_keep = [int]`   
可选。对特定配置执行 vacuum 操作。要保留的最新快照的最小数量。默认 为 1。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [VACUUM](vacuum-statement.md)。  
`vacuum_min_snapshots_to_keep` 属性需要 Athena 引擎版本 3。
例如：  

```
WITH (vacuum_min_snapshots_to_keep = 1)
```  
 `vacuum_max_snapshot_age_seconds = [long]`   
可选。对特定配置执行 vacuum 操作。以秒为单位的时间段，表示要保留的快照期限。默认值为 432000（5 天）。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [VACUUM](vacuum-statement.md)。  
`vacuum_max_snapshot_age_seconds` 属性需要 Athena 引擎版本 3。
例如：  

```
WITH (vacuum_max_snapshot_age_seconds = 432000)
```  
 `write_compression = [compression_format]`   
用于允许指定压缩的任何存储格式的压缩类型。`compression_format` 值指定将数据写入表时要使用的压缩。您可以为 `TEXTFILE`、`JSON`、`PARQUET` 和 `ORC` 文件格式指定压缩。  
例如，如果 `format` 属性指定 `PARQUET` 作为存储格式，则 `write_compression` 的值指定 Parquet 的压缩格式。在这种情况下，为 `write_compression` 指定一个值等同于为 `parquet_compression` 指定一个值。  
同样，如果 `format` 属性指定 `ORC` 作为存储格式，则 `write_compression` 的值指定 ORC 的压缩格式。在这种情况下，为 `write_compression` 指定一个值等同于为 `orc_compression` 指定一个值。  
不能在同一 CTAS 查询中指定多个压缩格式表属性。例如，您无法在同一个查询中同时指定 `write_compression` 和 `parquet_compression`。这同样适用于 `write_compression` 和 `orc_compression`。有关每种文件格式支持的压缩类型的信息，请参阅 [在 Athena 中使用压缩](compression-formats.md)。  
 `orc_compression = [compression_format]`   
将 `ORC` 数据写入表时用于 `ORC` 文件格式的压缩类型。例如，`WITH (orc_compression = 'ZLIB')`。`ORC` 文件内的数据块（`ORC` Postscript 除外）使用您指定的压缩进行压缩。如果省略，则默认情况下对 `ORC` 使用 ZLIB 压缩。  
为保持一致性，我们建议您使用 `write_compression` 属性而不是 `orc_compression`。使用 `format` 属性将存储格式指定为 `ORC`，然后使用 `write_compression` 属性指定 `ORC` 将使用的压缩格式。  
 `parquet_compression = [compression_format]`   
将 Parquet 数据写入表时用于 Parquet 文件格式的压缩类型。例如，`WITH (parquet_compression = 'SNAPPY')`。此压缩应用于 Parquet 文件中的列块。如果省略，则默认情况下对 Parquet 使用 GZIP 压缩。  
为保持一致性，我们建议您使用 `write_compression` 属性而不是 `parquet_compression`。使用 `format` 属性将存储格式指定为 `PARQUET`，然后使用 `write_compression` 属性指定 `PARQUET` 将使用的压缩格式。  
 `compression_level = [compression_level]`   
要使用的压缩级别。此属性仅适用于 ZSTD 压缩。可能的值介于 1 和 22 之间。默认值为 3。有关更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。

## 示例
<a name="ctas-table-examples"></a>

有关 CTAS 查询的示例，请参阅以下资源。
+  [CTAS 查询的示例](ctas-examples.md) 
+  [将 CTAS 和 INSERT INTO 用于 ETL 和数据分析](ctas-insert-into-etl.md) 
+  [将 CTAS 语句与 Amazon Athena 结合使用以降低成本并提高性能](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/) 
+  [使用 CTAS 和 INSERT INTO 绕过 100 分区限制](ctas-insert-into.md) 