

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

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

以您指定的名稱和參數建立資料表。

**注意**  
此頁包含摘要參考資訊。如需在 Athena 中建立資料表的詳細資訊和範例 `CREATE TABLE` 陳述式，請參閱[在 Athena 中建立資料表](creating-tables.md)。如需在 Athena 建立資料庫、建立資料表和執行資料表 `SELECT` 查詢的範例，請參閱 [開始使用](getting-started.md)。

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

```
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://amzn-s3-demo-bucket/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['encryption_option'='SSE_S3 | SSE_KMS | CSE_KMS',] ['kms_key'='aws_kms_key_arn',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]
```

## Parameters
<a name="parameters"></a>

**EXTERNAL**  
指定資料表依據您指定的 `LOCATION` 中 Amazon S3 現有的基礎資料檔案。除了在建立 [Iceberg](querying-iceberg-creating-tables.md) 資料表時，請始終使用 `EXTERNAL` 關鍵字。如果您在非 Iceberg 資料表上使用 `CREATE TABLE` 卻沒有帶 `EXTERNAL` 關鍵字，則 Athena 會發出錯誤。當您建立外部資料表，被參考的資料必須符合預設格式或您以 `ROW FORMAT`、`STORED AS` 及 `WITH SERDEPROPERTIES` 子句指定的格式。

**[IF NOT EXISTS]**  
此參數會檢查具有相同名稱的資料表是否已經存在。如果存在，參數會傳回 `TRUE`，Amazon Athena 會取消 `CREATE TABLE` 動作。由於取消會在 Athena 呼叫資料目錄之前發生，因此不會發出 AWS CloudTrail 事件。

**[db\$1name.]table\$1name**  
指定要建立的資料表名稱。選用的 `db_name` 參數可指定資料表所在的資料庫。如果省略，會採用目前的資料庫。如果資料表名稱包含號碼，以引號括住 `table_name`，例如 `"table123"`。如果 `table_name` 以底線開頭，請使用反引號，例如 ``_mytable``。不支援特殊字元 (底線除外)。  
Athena 資料表名稱不區分大小寫；不過，如果您使用 Apache Spark，則 Spark 的資料表名稱需為小寫字母。如需有關 Athena 中資料表名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。

**[ ( col\$1name data\$1type [COMMENT col\$1comment] [, ...] ) ]**  
指定要建立的每一欄名稱以及欄的資料類型。欄名稱不可使用底線 `(_)` 以外的特殊字元。如果 `col_name` 以底線開頭，以反引號括住欄名稱，例如 ``_mycolumn``。如需有關 Athena 中資料欄名稱的限制，請參閱 [為資料庫、資料表和資料欄命名](tables-databases-columns-names.md)。  
`data_type` 可以是下列任何值：  
+ `boolean` – 值為 `true` 和 `false`。
+ `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\$1308d，正極或負極。`double` 遵循浮點數運算的 IEEE 標準 (IEEE 754)。
+ `float` – 32 位元單精度浮點數。該範圍為 1.40129846432481707e-45 至 3.40282346638528860e\$138，正極或負極。`float` 遵循浮點數運算的 IEEE 標準 (IEEE 754)。等同於 Prestor 中的 `real`。在 Athena 中，請使用 DDL 陳述式中的 `float`，例如 `CREATE TABLE`，以及 SQL 函數中的 `real`，例如 `SELECT CAST`。 AWS Glue 爬蟲程式會傳回 中的值`float`，而 Athena 會在內部翻譯`real`和`float`輸入 （請參閱[2018 年 6 月 5 日](release-notes.md#release-note-2018-06-05)版本備註）。
+ `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 資料類型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-char)。
+ `varchar` – 可變長度的字元資料，介於 1 到 65535 的指定長度，例如 `varchar(10)`。如需詳細資訊，請參閱 [VARCHAR Hive 資料類型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-varchar)。
+ `string` – 用單引號或雙引號括住的字串文字。
**注意**  
非字串資料類型不能轉換為 Athena 中的 `string`；請改將它們轉換為 `varchar`。
+ `binary` – (用於 Parquet 的資料)
+ `date` – ISO 格式的日期，例如 `YYYY-MM-DD`。例如 `date '2008-09-15'`。一個例外是 OpenCSVSerDe，它使用自 1970 年 1 月 1 日以來經過的天數。如需詳細資訊，請參閱 [用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `timestamp` – 在 [https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html](https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html) 相容格式下的日期和時間常數，最大解析度為毫秒，例如 `yyyy-MM-dd HH:mm:ss[.f...]`。例如 `timestamp '2008-09-15 03:04:05.324'`。一個例外是 OpenCSVSerDe，它使用 UNIX 數字格式的 `TIMESTAMP` 資料 (例如 `1579059880000`)。如需詳細資訊，請參閱[用於處理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `array` < data\$1type >
+ `map` < primitive\$1type, data\$1type >
+ `struct` < col\$1name : data\$1type [comment col\$1comment] [, ...] >

**[COMMENT table\$1comment]**  
建立 `comment` 資料表屬性，並填入您指定的 `table_comment`。

**[PARTITIONED BY (col\$1name data\$1type [ COMMENT col\$1comment ], ... ) ]**  
建立有分割區的資料表，具有包含指定的 `col_name`、`data_type`、`col_comment` 的一或多個分割區欄。資料表可以有一或多個分割區，各自由不同欄名稱和值組合而成。每種指定的組合都會另外建立一個資料目錄，這樣可在某些情況下改善查詢效能。資料表資料內並未包含分割資料欄。如果您使用的 `col_name` 值與資料表欄相同，則會發生錯誤。如需詳細資訊，請參閱[分割資料](partitions.md)。  
在您建立分割區資料表後，執行包含 [MSCK REPAIR TABLE](msck-repair-table.md) 子句的後續查詢 (例如，`MSCK REPAIR TABLE cloudfront_logs;`) 以重新整理分割區中繼資料。對於與 Hive 不相容的分割區，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 載入分割區，以便查詢資料。

**[CLUSTERED BY (col\$1name, col\$1name, ...) INTO num\$1buckets BUCKETS]**  
透過或不透過分割，將指定的 `col_name` 資料欄中的資料分割為稱為*儲存貯體*的資料子集。`num_buckets` 參數會指定要建立的儲存貯體數目。歸納可以改善對大型資料集的某些查詢的效能。

**[ROW FORMAT row\$1format]**  
指定資料表的列格式及其基礎來源資料 (如果適用)。在 `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 及 `TEXTFILE` 的 STORED AS 檔案格式。
 **--或--**   
+ SERDE 'serde\$1name' [WITH SERDEPROPERTIES ("property\$1name" = "property\$1value", "property\$1name" = "property\$1value" [, ...] )]

  `serde_name` 指出要使用 SerDe。`WITH SERDEPROPERTIES` 子句可讓您提供一個或多個 SerDe 允許的自訂屬性。

**[STORED AS file\$1format]**  
指定資料表中資料的檔案格式。如果省略，`TEXTFILE` 為預設值。`file_format` 的選項有：  
+ SEQUENCEFILE
+ TEXTFILE
+ RCFILE
+ ORC
+ PARQUET
+ AVRO
+ ION
+ INPUTFORMAT input\$1format\$1classname OUTPUTFORMAT output\$1format\$1classname

**[LOCATION 's3://amzn-s3-demo-bucket/[folder]/']**  
指定 Amazon S3 中基礎資料的位置，資料表根據此資料建立。位置路徑必須是儲存貯體名稱或儲存貯體和一或多個資料夾。如果您使用的是分割區，請指定分割資料的根目錄。如需資料表位置的詳細資訊，請參閱 [在 Amazon S3 中指定資料表位置](tables-location-format.md)。如需資料格式和許可的資訊，請參閱[Amazon S3 考量事項](creating-tables.md#s3-considerations)。  
為您的資料夾或儲存貯體使用尾隨斜線。請勿使用檔案名稱或 glob 字元。  
 **使用**：  
`s3://amzn-s3-demo-bucket/`  
`s3://amzn-s3-demo-bucket/folder/`  
`s3://amzn-s3-demo-bucket/folder/anotherfolder/`  
 **不要使用：**  
`s3://amzn-s3-demo-bucket`  
`s3://amzn-s3-demo-bucket/*`  
`s3://amzn-s3-demo-bucket/mydatafile.dat`

**【TBLPROPERTIES ( 【'has\$1encrypted\$1data'='true \$1 false'，】 【'encryption\$1option'='SSE\$1S3 \$1 SSE\$1KMS \$1 CSE\$1KMS'，】 【'kms\$1key'='aws\$1kms\$1key\$1arn'，】 【'classification'='classification\$1value'，】 property\$1name=property\$1value 【， ...】 ) 】**  
除了預先定義的資料表屬性 (例如 `"comment"`)，也為資料表定義指定自訂中繼資料鍵值組。  
**has\$1encrypted\$1data** – Athena 有一個內建的屬性 `has_encrypted_data`。將此屬性設定為 ，`true`表示 指定的基礎資料集`LOCATION`已加密 CSE-KMS。如果省略且工作群組的設定不會覆寫用戶端設定，則假定為 `false`。如果省略或設為 `false` 時基礎資料有加密，查詢會導致錯誤。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**encryption\$1option** – 將此屬性設定為 `SSE_S3`、 `SSE_KMS`或 `CSE_KMS`，以指出 指定的基礎資料集中使用的最高加密層級`LOCATION`。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**kms\$1key** – 將此屬性設定為用於加密和解密資料表資料檔案的 AWS KMS 金鑰 ARN。Athena 使用此金鑰來加密使用 `SSE_KMS`或 加密寫入的資料表資料檔案`CSE_KMS`，以及解密 CSE-KMS 加密的資料表資料檔案。只有在 `encryption_option` 設定為 `SSE_KMS`或 時，才需要此屬性`CSE_KMS`。如需詳細資訊，請參閱[靜態加密](encryption.md)。  
**分類** – CloudTrail 主控台中為 Athena 建立的資料表新增 `cloudtrail` 做為 `classification` 屬性的值。若要執行 ETL 任務， AWS Glue 會要求您使用 `classification` 屬性建立資料表，以將 的資料類型指定 AWS Glue 為 `csv`、`parquet`、`orc`、 `avro`或 `json`。例如 `'classification'='csv'`。如果您沒有指定此屬性，ETL 工作會失敗。之後，您可以使用 AWS Glue 主控台、API 或 CLI 來進行指定。如需詳細資訊，請參閱《 *AWS Glue 開發人員指南*》中的[建立用於 ETL 任務的資料表](schema-classifier.md)在 [AWS Glue 中編寫任務](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)。  
**compression\$1level** – `compression_level` 屬性指定要使用的壓縮級別。此屬性僅適用於 ZSTD 壓縮。可能的值為 1 到 22。預設值為 3。如需詳細資訊，請參閱[使用 ZSTD 壓縮級別](compression-support-zstd-levels.md)。  
如需有關其他資料表屬性的詳細資訊，請參閱 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)。

## 範例
<a name="create-table-examples"></a>

下列範例 `CREATE TABLE` 陳述式會根據存放在 Amazon S3 中的製表符分隔行星資料建立資料表。

```
CREATE EXTERNAL TABLE planet_data (
  planet_name string,
  order_from_sun int,
  au_to_sun float,
  mass float,
  gravity_earth float,
  orbit_years float,
  day_length float
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/tsv/'
```

請注意以下重點：
+ `ROW FORMAT DELIMITED` 子句指出，資料以特定字元分隔。
+ `FIELDS TERMINATED BY '\t'` 子句指定，TSV 資料中的欄位以製表符字元 ('\$1t') 分隔。
+ `STORED AS TEXTFILE` 子句指出，資料會以純文字檔案的形式存放在 Amazon S3 中。

若要查詢資料，您可以使用簡單的 `SELECT` 陳述式，如下所示：

```
SELECT * FROM planet_data
```

若要使用範例在 Athena 中建立您自己的 TSV 資料表，請將資料表和資料欄名稱取代為您自己的資料表和資料欄的名稱和資料類型，然後更新 `LOCATION` 子句以指向存放 TSV 檔案的 Amazon S3 路徑。

如需建立資料表的詳細資訊，請參閱 [在 Athena 中建立資料表](creating-tables.md)。