

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

# 變更資料欄資料類型
<a name="updates-changing-column-type"></a>

當現有類型無法再保留所需資訊量時，您可能想要使用不同的資料欄類型。例如，ID 資料欄的值可能超過 `INT` 資料類型的大小，而且需要使用 `BIGINT` 資料類型。

## 考量事項
<a name="updates-changing-column-type-considerations"></a>

當您規劃使用不同的資料類型做為資料欄時，請考慮下列幾點：
+ 在大多數的案例中，您無法直接變更資料欄的資料類型。相反，您要重新建立 Athena 資料表，並使用新的資料類型定義資料欄。
+ 只有特定資料類型才可讀取為其他資料類型。有關可如此處理的資料類型，請參閱本節中的資料表。
+ 對於 Parquet 和 ORC 的資料，如果資料表未分割，則您無法對一個資料欄使用不同的資料類型。
+ 對於 Parquet 和 ORC 的分割資料表，分割區的資料欄類型可能不同於另一個分割區的資料欄類型，可能的話，Athena 會 `CAST` 到所需的類型。如需相關資訊，請參閱[避免含有分割區的資料表發生結構描述不符的錯誤](updates-and-partitions.md#partitions-dealing-with-schema-mismatch-errors)。
+ 對於僅使用 [LazySimpleSerDe](lazy-simple-serde.md) 建立的資料表，則可以使用 `ALTER TABLE REPLACE COLUMNS` 陳述式將現有的資料欄取代為不同的資料類型，但是您想要保留的所有現有資料欄也必須在陳述式中重新定義，否則它們將會被刪除。如需詳細資訊，請參閱[ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)。
+ 僅對於 Apache Iceberg 資料表，您可以使用 [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md) 陳述式來變更資料欄的資料類型。 `ALTER TABLE REPLACE COLUMNS` 不支援 Iceberg 資料表。如需詳細資訊，請參閱[演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md)。

**重要**  
在執行資料類型轉換之前，強烈建議您測試和驗證您的查詢。如果 Athena 無法使用目標資料類型，`CREATE TABLE` 查詢可能會失敗。

## 使用相容的資料類型
<a name="updates-changing-column-type-use-compatible-data-types"></a>

盡可能使用相容的資料類型。下表列出了可能會被視為其他資料類型的資料類型：


| 原始資料類型 | 可用的目標資料類型 | 
| --- | --- | 
| STRING | BYTE, TINYINT, SMALLINT, INT, BIGINT | 
| BYTE | TINYINT, SMALLINT, INT, BIGINT | 
| TINYINT | SMALLINT, INT, BIGINT | 
| SMALLINT | INT, BIGINT | 
| INT | BIGINT | 
| FLOAT | DOUBLE | 

下列範例會使用原始 `orders_json` 資料表的 `CREATE TABLE` 陳述式來建立名為 `orders_json_bigint` 的新資料表。新資料表使用 `BIGINT` (而不是 `INT`) 做為 ``o_shippriority`` 資料欄的資料類型。

```
CREATE EXTERNAL TABLE orders_json_bigint (
   `o_orderkey` int, 
   `o_custkey` int, 
   `o_orderstatus` string, 
   `o_totalprice` double, 
   `o_orderdate` string, 
   `o_orderpriority` string, 
   `o_clerk` string, 
   `o_shippriority` BIGINT
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket/orders_json';
```

在資料類型變更之前，以下查詢執行成功，類似於原始 `SELECT` 查詢：

```
Select * from orders_json 
LIMIT 10;
```