

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 陳述式一起分組，但是針對 Service Quotas 而言，Athena 中的 CTAS 查詢仍會被視為 DML。如需有關 Athena 中的 Service Quotas 的相關資訊，請參閱 [Service Quotas](service-limits.md)。

**注意**  
對於 CTAS 陳述式，預期的儲存貯體擁有者設定不適用於 Simple Storage Service (Amazon S3) 中的目的地資料表位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Simple Storage Service (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)。

**query**  
用於建立新資料表的 [SELECT](select.md) 查詢。  
如果您打算以分割區建立查詢，在 `SELECT` 陳述式的欄清單最後指定分割區各欄的名稱。

**[ WITH [ NO ] DATA ]**  
如果使用 `WITH NO DATA`，新的空資料表具有的結構描述會與建立的原始資料表相同。

**注意**  
若要將資料欄標題包含在查詢結果輸出中，您可以使用簡單的 `SELECT` 查詢而不是 CTAS 查詢。您可以從查詢結果位置擷取結果，或直接使用 Athena 主控台下載結果。如需詳細資訊，請參閱[使用查詢結果和近期查詢](querying.md)。

## CTAS 資料表屬性
<a name="ctas-table-properties"></a>

Athena 中的每個 CTAS 資料表會有一個您使用 `WITH (property_name = expression [, ...] )` 指定的 CTAS 資料表選用屬性清單。如需這些參數的用法詳細資訊，請參閱 [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 查詢將會失敗。  
如果您執行一個在[強制執行查詢結果位置](workgroups-settings-override.md)的工作群組中指定 `external_location` 的 CTAS 查詢，則該查詢會失敗並顯示錯誤訊息。若要查看為工作群組指定的查詢結果位置，請[檢視工作群組的詳細資訊](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_tw/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]`   
選用。清空特定組態。要保留之最新快照的數目下限。預設為 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]`   
選用。清空特定組態。以秒為單位的期間，代表要保留之快照的存留期。預設為 432,000 (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')`。此壓縮會套用至 Prquet 檔案中的資料欄區塊。若省略，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) 