

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

# 使用 Athena ACID 交易
<a name="acid-transactions"></a>

「ACID 交易」一詞是指一組可確保資料庫交易中資料完整性的屬性 ([不可分割性](https://en.wikipedia.org/wiki/Atomicity_(database_systems))、[一致性](https://en.wikipedia.org/wiki/Consistency_(database_systems))、[隔離](https://en.wikipedia.org/wiki/Isolation_(database_systems))和[耐久性](https://en.wikipedia.org/wiki/Durability_(database_systems)))。ACID 交易可讓多位使用者以原子方式同時可靠地新增和刪除 Amazon S3 物件，同時透過維持對資料湖查詢的讀取一致性來隔離任何現有查詢。Athena ACID 交易為 Athena SQL 資料處理語言 (DML) 新增對插入、刪除、更新和時間歷程操作的單一資料表支援。您和多個並行使用者可以使用 Athena ACID 交易，對 Amazon S3 資料進行可靠的資料列層級修改。Athena 交易會自動管理鎖定語義和協調，並且不需要自訂記錄鎖定解決方案。

Athena ACID 交易和熟悉的 SQL 語法可簡化您的業務和法規資料的更新。例如，若要回應資料清除請求，您可以執行 SQL `DELETE` 操作。若要進行手動記錄更正，您可以使用單一 `UPDATE` 陳述式。若要復原最近刪除的資料，您可以使用 `SELECT` 陳述式發佈時間歷程查詢。

因為它們是建立在共用資料表格式上，Athena ACID 交易與其他服務和引擎相容，例如 [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) 和 [Apache Spark](https://spark.apache.org/) 也支援共用資料表格式。

Athena 交易可透過 Athena 主控台、API 操作以及 ODBC 和 JDBC 驅動程式取得。

**Topics**
+ [查詢 Linux Foundation Delta Lake 資料表](delta-lake-tables.md)
+ [查詢 Apache Hudi 資料集](querying-hudi.md)
+ [查詢 Apache Iceberg 資料表](querying-iceberg.md)

# 查詢 Linux Foundation Delta Lake 資料表
<a name="delta-lake-tables"></a>

Linux Foundation [Delta Lake](https://delta.io/) 是用於大數據分析的資料表格式。您可以使用 Amazon Athena 直接讀取存放在 Amazon S3 中的 Delta Lake 資料表，而無需產生清單檔案或執行 `MSCK REPAIR` 陳述式。

Delta Lake 格式會儲存每個資料檔案中每個資料欄的最小值和最大值。Athena 實作會利用這項資訊來啟用述詞上的檔案略過功能，從而排除不需要的檔案。

## 考量和限制
<a name="delta-lake-tables-considerations-and-limitations"></a>

Athena 中的 Delta Lake 支援具有下列考量事項和限制：
+ **僅限目錄的資料表 AWS Glue ** – 僅透過向 註冊的資料表支援原生 Delta Lake 支援 AWS Glue。如果有已在其他中繼存放區註冊的 Delta Lake 資料表，則您仍然可以保留並將其視為您的主要中繼存放區。由於 Delta Lake 中繼資料存放在檔案系統 （例如，在 Amazon S3 中） 而非中繼存放區中，Athena 只需要 中的位置屬性， AWS Glue 即可從 Delta Lake 資料表讀取。
+ **V3 engine only** (僅限 V3 引擎) – 只有 Athena 引擎版本 3 才支援 Delta Lake 查詢。您必須確定您建立的工作群組設定為使用 Athena 引擎版本 3。
+ **No time travel support** (不支援時間歷程) – 不支援使用 Delta Lake 時間歷程功能的查詢。
+ **Read only** (唯讀) – 不支援寫入 `UPDATE`、`INSERT` 或 `DELETE` 等 DML 陳述式。
+ **Lake Formation 支援** – Lake Formation 可用於結構描述與 AWS Glue同步的 Delta Lake 資料表。如需詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[使用 AWS Lake Formation 搭配 Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html) 和[設定 Delta Lake 資料表的許可](https://docs.aws.amazon.com/lake-formation/latest/dg/set-up-delta-table.html)。
+ **Limited DDL support** (有限的 DDL 支援) – 支援下列 DDL 陳述式：`CREATE EXTERNAL TABLE`、`SHOW COLUMNS`、`SHOW TBLPROPERTIES`、`SHOW PARTITIONS`、`SHOW CREATE TABLE` 和 `DESCRIBE`。如需有關使用 `CREATE EXTERNAL TABLE` 陳述式的詳細資訊，請參閱 [Delta Lake 資料表入門](delta-lake-tables-getting-started.md) 一節。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Linux Foundation Delta Lake 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。
+ **加密資料表** – Athena 不支援原生讀取 CSE-KMS 加密的 Delta Lake 資料表。這包括 SELECT 陳述式和 DDL 陳述式。

### Delta Lake 版本控制和 Athena
<a name="delta-lake-tables-versioning"></a>

Athena 不使用 Delta Lake 文件中列出的[版本控制](https://docs.delta.io/latest/releases.html)。若要判斷您的 Delta Lake 資料表是否會與 Athena 相容，請考慮下列兩個特性：
+ **讀取器版本 ** – 每個 Delta Lake 資料表都有讀取器版本。目前，這是介於 1 到 3 之間的數字。如果查詢包含具有 Athena 不支援之讀取器版本的資料表，則將會失敗。
+ **資料表功能** – 每個 Delta Lake 資料表也可以宣告一組讀取器/寫入器功能。由於 Athena 對 Delta Lake 的支援是唯讀，因此資料表寫入器功能的相容性不適用。不過，對具有不支援的資料表讀取器功能的資料表進行查詢，也將會失敗。

下列資料表會顯示 Athena 支援的 Delta Lake 讀取器版本和 Delta Lake 資料表讀取器功能。


****  

| 查詢類型 | 支援的讀取器版本 | 支援的讀取器功能 | 
| --- | --- | --- | 
| DQL (SELECT statements) | <= 3 | [資料欄映射](https://docs.delta.io/latest/delta-column-mapping.html)、[timestampNtz](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#timestamp-without-timezone-timestampntz)、[刪除向量](https://docs.delta.io/latest/delta-deletion-vectors.html) | 
| DDL | <= 1 | 不適用。讀取器功能只能在讀取器版本為 2 或更高版本時宣告。 | 
+ 如需有關 Delta Lake 資料表的功能清單，請參閱 GitHub.com 上[資料表功能中的有效功能名稱](https://github.com/delta-io/delta/blob/master/PROTOCOL.md#valid-feature-names-in-table-features)
+ 如需依通訊協定版本列出的 Delta Lake 功能清單，請參閱 GitHub.com 上的[依通訊協定版本列出的功能](https://docs.delta.io/latest/versioning.html#features-by-protocol-version)。

若要在 Athena 中建立讀取器版本大於 1 的 Delta Lake 資料表，請參閱 [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md)。

**Topics**
+ [考量和限制](#delta-lake-tables-considerations-and-limitations)
+ [支援的資料欄資料類型](delta-lake-tables-supported-data-types-columns.md)
+ [Delta Lake 資料表入門](delta-lake-tables-getting-started.md)
+ [使用 SQL 查詢 Delta Lake 資料表](delta-lake-tables-querying.md)
+ [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md)
+ [其他資源](delta-lake-tables-additional-resources.md)

# 支援的資料欄資料類型
<a name="delta-lake-tables-supported-data-types-columns"></a>

本節說明非分割區和分割區資料欄支援的資料類型。

## 支援的非分割區資料欄資料類型
<a name="delta-lake-tables-supported-data-types-non-partition-columns"></a>

對於非分割區資料欄，支援 Athena 支援的所有資料類型，除了 `CHAR` 之外 (Delta Lake 通訊協定本身不支援 `CHAR`)。支援的資料類型包括：

```
boolean
tinyint
smallint
integer
bigint
double
float
decimal
varchar
string
binary
date
timestamp
array
map
struct
```

## 支援的分割區資料欄資料類型
<a name="delta-lake-tables-supported-data-types-partition-columns"></a>

對於分割區資料欄，Athena 支援具有下列資料類型的資料表：

```
boolean
integer
smallint
tinyint
bigint
decimal
float
double
date
timestamp
varchar
```

如需有關 Athena 中資料類型的詳細資訊，請參閱 [Amazon Athena 中的資料類型](data-types.md)。

# Delta Lake 資料表入門
<a name="delta-lake-tables-getting-started"></a>

若要查詢，您的 Delta Lake 資料表必須存在於其中 AWS Glue。如果您的資料表位於 Amazon S3 中，但未位於 中 AWS Glue，請使用下列語法執行`CREATE EXTERNAL TABLE`陳述式。如果您的資料表已存在於 AWS Glue （例如，因為您使用 Apache Spark 或其他引擎搭配 AWS Glue)，您可以略過此步驟。請注意忽略的資料欄定義、SerdE 程式庫和其他資料表屬性。與傳統 Hive 資料表不同，Delta Lake 資料表中繼資料會從 Delta Lake 交易日誌推斷並直接同步至 AWS Glue。

```
CREATE EXTERNAL TABLE
  [db_name.]table_name
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ('table_type' = 'DELTA')
```

**注意**  
此陳述式與已啟用請求者支付的 S3 儲存貯體不相容。如果您想要針對已啟用請求者支付的 S3 儲存貯體建立 Delta Lake 資料表，請遵循 [同步處理 Delta Lake 中繼資料](delta-lake-tables-syncing-metadata.md) 中的說明和 DDL 陳述式。
對於 Delta Lake 資料表，不允許包含超過 `LOCATION` 和 `table_type` 屬性的 `CREATE TABLE` 陳述式。

# 使用 SQL 查詢 Delta Lake 資料表
<a name="delta-lake-tables-querying"></a>

若要查詢 Delta Lake 資料表，請使用標準 SQL `SELECT` 語法：

```
[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

如需有關 `SELECT` 語法的詳細資訊，請參閱 Athena 文件中的 [SELECT](select.md)。

Delta Lake 格式會儲存每個資料檔案中每個資料欄的最小值和最大值。Athena 會利用這項資訊來啟用述詞上的檔案略過功能，從而排除不需要的檔案。

# 同步處理 Delta Lake 中繼資料
<a name="delta-lake-tables-syncing-metadata"></a>

 AWS Glue 如果您使用 Athena 建立 Delta Lake 資料表，Athena 會將資料表中繼資料，包括結構描述、分割區資料欄和資料表屬性同步至 。隨著時間流逝，此中繼資料可能會遺失與交易日誌中基礎資料表中繼資料的同步處理。要讓資料表保持最新，您可以選擇下列其中一個選項：
+ 使用 Delta Lake 資料表的 AWS Glue 爬蟲程式。如需詳細資訊，請參閱 *AWS 大數據部落格*中的[介紹原生 Delta Lake 資料表支援與 AWS Glue 爬蟲程式](https://aws.amazon.com/blogs/big-data/introducing-native-delta-lake-table-support-with-aws-glue-crawlers/)，以及《 AWS Glue 開發人員指南》中的[排程 AWS Glue 爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html)。
+ 在 Athena 捨棄並重新建立資料表。
+ 使用 SDK、CLI 或 AWS Glue 主控台手動更新 中的結構描述 AWS Glue。

請注意，下列功能需要您的 AWS Glue 結構描述一律具有與交易日誌相同的結構描述：
+ Lake Formation
+ 檢視
+ 資料列與資料欄篩選

如果您的工作流程不需要任何此功能，而且您不想維持此相容性，則可以在 Athena 中使用 `CREATE TABLE` DDL，然後在 AWS Glue中新增 Amazon S3 路徑做為 SerdE 參數。

## 使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表
<a name="delta-lake-tables-syncing-metadata-console"></a>

您可以使用下列程序，使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表。

**使用 Athena 和 AWS Glue 主控台建立 Delta Lake 資料表**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 在 Athena 查詢編輯器中，使用下列 DDL 建立您的 Delta Lake 資料表。請注意，使用此方法時，`TBLPROPERTIES` 的值必須是 `'spark.sql.sources.provider' = 'delta'` 而不是 `'table_type' = 'delta'`。

   請注意，當您使用 Apache Spark (Athena for Apache Spark) 或大多數其他引擎來建立資料表時，將插入此相同的結構描述 (具有名為 `col` 的類型 `array<string>` 的單一資料欄)。

   ```
   CREATE EXTERNAL TABLE
      [db_name.]table_name(col array<string>)
      LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
      TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
   ```

1. 在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇**資料目錄**、**資料表**。

1. 在資料表清單中，選擇資料表的連結。

1. 在資料表的頁面上，選擇**動作**、**編輯資料表**。

1. 在 **Serde 參數**區段中，新增索引鍵 **path** 與值 **s3://amzn-s3-demo-bucket/*your-folder*/**。

1. 選擇**儲存**。

## 使用 建立 Delta Lake 資料表 AWS CLI
<a name="delta-lake-tables-syncing-metadata-cli"></a>

若要使用 建立 Delta Lake 資料表 AWS CLI，請輸入如下所示的命令。

```
aws glue create-table --database-name dbname \
    --table-input '{"Name" : "tablename", "StorageDescriptor":{
            "Columns" : [
                {
                    "Name": "col",
                    "Type": "array<string>"
                }
            ],
            "Location" : "s3://amzn-s3-demo-bucket/<prefix>/",
            "SerdeInfo" : {
                "Parameters" : {
                    "serialization.format" : "1",
                    "path" : "s3://amzn-s3-demo-bucket/<prefix>/"
                }
            }
        },
        "PartitionKeys": [],
        "TableType": "EXTERNAL_TABLE",
        "Parameters": {
            "EXTERNAL": "TRUE",
            "spark.sql.sources.provider": "delta"
        }
    }'
```

# 其他資源
<a name="delta-lake-tables-additional-resources"></a>

如需搭配 使用 Delta Lake 資料表 AWS Glue 和搭配 Athena 查詢它們的討論，請參閱 *AWS 大數據部落格中的*[使用開放原始碼 Delta Lake 處理 UPSERT 資料操作 AWS Glue](https://aws.amazon.com/blogs/big-data/handle-upsert-data-operations-using-open-source-delta-lake-and-aws-glue/)。

# 查詢 Apache Hudi 資料集
<a name="querying-hudi"></a>

[https://hudi.incubator.apache.org/](https://hudi.incubator.apache.org/) 是一個開源資料管理架構，可簡化增量資料的處理。記錄級的插入、更新、更新插入和刪除動作會得到更細微的處理，從而減少開銷。`Upsert` 是指將記錄插入現有資料集 (如果記錄尚不存在)，或者更新記錄 (如果記錄存在) 的能力。

Hudi 處理資料插入和更新事件，而不會建立許多可能會導致分析效能問題的小型檔案。Apache Hudi 會自動追蹤變更和合併檔案，以便檔案保持在最佳的大小。如此可避免建置自訂解決方案，這些解決方案用來監控許多小型檔案並將其重新寫入較少的大型檔案。

Hudi 資料集適用於以下使用案例：
+ 遵守隱私權規定，例如[一般資料保護規範](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) (歐盟《一般資料保護規範》(GDPR)) 及[加州消費者隱私法](https://en.wikipedia.org/wiki/California_Consumer_Privacy_Act) (CCPA)，這些法規會強制執行使用者移除個人資訊或變更其資料使用方式的權利。
+ 處理來自感應器和其他物聯網 (IoT) 裝置的串流資料，這些資料需要特定的資料插入和更新事件。
+ 實作[變更資料擷取 (CDC) 系統](https://en.wikipedia.org/wiki/Change_data_capture)。

Hudi 資料集可以是以下類型之一：
+ **寫入時複製 (CoW)** – 資料會以單欄式格式 (Parquet) 存放，每次更新都會在寫入期間建立新版本的檔案。
+ **讀取時合併 (MoR)** – 資料的存放是使用單欄式 (Parquet) 和以資料行為基礎 (Avro) 格式的組合。更新會記錄到以資料行為基礎的 `delta` 檔案，並視需要壓縮以建立新版本的單欄式檔案。

使用 CoW 資料集，每次有記錄進行更新時，包含記錄的檔案就會以更新的值重寫。若使用 MoR 資料集，每次有更新時，Hudi 只會寫入已變更之記錄的資料行。MoR 更適合較少讀取，而寫入或變更較繁重的工作負載。CoW 更適合資料變更較不頻繁，而讀取作業較為繁重的工作負載。

Hudi 提供三個可用於資料存取的查詢類型：
+ **快照查詢** – 查詢會查看截至給定遞交或壓縮動作的資料表的最新快照。對於 MoR 資料表，快照查詢會公開資料表的最新狀態，方法是合併查詢時最新檔案切片的基底和 delta 檔案。
+ **增量查詢** – 查詢只會看到自給定的遞交/壓縮以來在資料表中寫入的新資料。這會有效地提供變更串流，以啟用增量資料管道。
+ **讀取最佳化查詢** – 對於 MoR 資料表，查詢會看到壓縮的最新資料。對於 CoW 資料表，查詢會看到遞交的最新資料。

下表顯示每個資料表類型可能的 Hudi 查詢類型。


| 資料表類型 | 可能的 Hudi 查詢類型 | 
| --- | --- | 
| 寫入時複製 | 快照、增量 | 
| 讀取時合併 | 快照、增量、讀取最佳化 | 

如需有關資料表和查詢類型之間取捨的詳細資訊，請參閱 Apache Hudi 文件中的[資料表和查詢類型](https://hudi.apache.org/docs/table_types/)。

## Hudi 術語變更：檢視現在是查詢
<a name="querying-hudi-hudi-dataset-table-types-terminology"></a>

從 Apache Hudi 0.5.1 版本開始，以前的檢視現在稱為稱為查詢。下表摘要列出新舊術語之間的變更。


| 舊術語 | 新術語 | 
| --- | --- | 
|  CoW：讀取最佳化檢視 MoR：即時檢視  |  快照查詢  | 
| 增量檢視 | 增量查詢 | 
| MoR 讀取最佳化檢視 | 讀取最佳化查詢 | 

**Topics**
+ [Hudi 術語變更：檢視現在是查詢](#querying-hudi-hudi-dataset-table-types-terminology)
+ [考量和限制](querying-hudi-in-athena-considerations-and-limitations.md)
+ [寫入時複製 (CoW) 建立資料表範例](querying-hudi-copy-on-write-create-table-examples.md)
+ [讀取時合併 (MoR) 建立資料表範例](querying-hudi-merge-on-read-create-table-examples.md)
+ [使用 Hudi 中繼資料以提升效能](querying-hudi-metadata-table.md)
+ [其他資源](querying-hudi-additional-resources.md)

# 考量和限制
<a name="querying-hudi-in-athena-considerations-and-limitations"></a>

當您使用 Athena 讀取 Apache Hudi 資料表時，請考慮下列幾點。
+ **讀取和寫入操作** – Athena 可以讀取壓縮的 Hudi 資料集，但無法寫入 Hudi 資料。
+ **Hudi 版本** – Athena 支援 Hudi 版本 0.14.0 （預設） 和 0.15.0。Athena 無法保證與使用較新版本 Hudi 建立之資料表的讀取相容性。如需有關 Hudi 功能和版本控制的詳細資訊，請參閱 Apache 網站上的 [Hudi 文件](https://hudi.apache.org/)。請注意，Athena 上的 Hudi 連接器 0.15.0 版不支援引導資料表。若要使用 Hudi 連接器的 0.15.0，請設定下列資料表屬性：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('athena_enable_native_hudi_connector_implementation' = 'true')
  ```
+ **跨帳戶查詢** – Hudi 連接器的 0.15.0 版不支援跨帳戶查詢。
+ **查詢類型** – 目前，Athena 支援快照查詢和讀取最佳化查詢，但不支援增量查詢。在 MoR 資料表上，所有公開給讀取最佳化查詢的資料均經過壓縮。這可提供良好的效能，但不包含最新的 delta 遞交。快照查詢包含最新資料，但會產生一些運算開銷，這使得這些查詢的效能較為不佳。如需有關資料表和查詢類型之間取捨的詳細資訊，請參閱 Apache Hudi 文件中的[資料表和查詢類型](https://hudi.apache.org/docs/table_types/)。
+ **增量查詢** – Athena 不支援增量查詢。
+ **CTAS** – Athena 不支援對 Hudi 資料執行 [CTAS](ctas.md) 或 [INSERT INTO](insert-into.md)。如果您希望 Athena 提供寫入 Hudi 資料集的支援，請將意見回饋傳送至 athena-feedback@amazon.com。

  如需有關寫入 Hudi 資料的詳細資訊，請參閱下列資源：
  + 《[Amazon EMR 版本指南](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/)》中的[使用 Hudi 資料集](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-work-with-dataset.html)。
  + Apache Hudi 文件中的[寫入資料](https://hudi.apache.org/docs/0.8.0/writing_data.html)。
+ **MSCK REPAIR TABLE** – 不支援在 Athena 中對 Hudi 資料表使用 MSCK REPAIR TABLE。如果您需要載入未在 中建立的 Hudi 資料表 AWS Glue，請使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Apache Hudi 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。
+ **時間戳記查詢** – 目前，嘗試讀取 Hudi 即時資料表中的時間戳記資料欄的查詢可能會失敗，也可能會產生空白結果。此限制僅適用於讀取時間戳記資料欄的查詢。僅包含相同資料表中非時間戳記資料欄的查詢會成功。

  失敗的查詢會傳回類似下列瑣所示的訊息：

  GENERIC\$1INTERNAL\$1ERROR：類別 org.apache.hadoop.io.ArrayWritable 無法轉換為類別 org.apache.hadoop.hive.serde2.io.TimestampWritableV2 (org.apache.hadoop.io.ArrayWritable 和 org.apache.hadoop.hive.serde2.io.TimestampWritableV2 位於載入器 io.trino.server.PluginClassLoader @75c67992 的未命名模組中）
+ **0.15.0 Hudi Connector 上的 Lake Formation 許可** – 此限制僅適用於透過將資料表屬性設定為 來選擇使用原生 Hudi 連接器 (0.15.0 版） `athena_enable_native_hudi_connector_implementation` 時`true`。根據預設，Athena 使用 Hudi 連接器 0.14.0 版，這不需要此額外許可。若要查詢 Lake Formation 保護的資料表，您必須將 Lake Formation 許可授予資料表的資料位置和`.hoodie`中繼資料目錄。例如，如果您的 Hudi 資料表位於 `s3://bucket/hudi-table/`，您必須註冊並授予許可給 Lake Formation `s3://bucket/hudi-table/.hoodie/`中的 `s3://bucket/hudi-table/`和 。`.hoodie` 目錄包含 Athena 在查詢規劃期間需要讀取的中繼資料檔案 （例如 `hoodie.properties`)。如果沒有`.hoodie`目錄的許可，查詢將會失敗，並出現許可遭拒錯誤。

# 寫入時複製 (CoW) 建立資料表範例
<a name="querying-hudi-copy-on-write-create-table-examples"></a>

如果您已在 中建立 Hudi 資料表 AWS Glue，您可以直接在 Athena 中查詢它們。在 Athena 中建立分割的 Hudi 資料表時，您必須執行 `ALTER TABLE ADD PARTITION` 以在查詢前載入 Hudi 資料。

## 未分割的 CoW 資料表
<a name="querying-hudi-nonpartitioned-cow-table"></a>

以下範例在 Athena 中建立未分割的 CoW 資料表。

```
CREATE EXTERNAL TABLE `non_partition_cow`(
  `_hoodie_commit_time` string,
  `_hoodie_commit_seqno` string,
  `_hoodie_record_key` string,
  `_hoodie_partition_path` string,
  `_hoodie_file_name` string,
  `event_id` string,
  `event_time` string,
  `event_name` string,
  `event_guests` int,
  `event_type` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
  'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/non_partition_cow/'
```

## 分割的 CoW 資料表
<a name="querying-hudi-partitioned-cow-table"></a>

以下範例在 Athena 中建立分割的 CoW 資料表。

```
CREATE EXTERNAL TABLE `partition_cow`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_cow/'
```

以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_cow` 資料表。

```
ALTER TABLE partition_cow ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_cow/one/' 
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_cow/two/'
```

# 讀取時合併 (MoR) 建立資料表範例
<a name="querying-hudi-merge-on-read-create-table-examples"></a>

Hudi 在 MoR 的中繼存放區中建立兩個資料表，一個為用於快照查詢的資料表，另一個為用於讀取最佳化查詢的資料表。這兩個資料表都可供查詢。在 0.5.1 之前的 Hudi 版本中，讀取最佳化查詢的資料表具有您在建立資料表時指定的名稱。從版本 Hudi 0.5.1 開始，資料表名稱的字尾預設為 `_ro`。快照查詢的資料表名稱是您指定的附有 `_rt` 的名稱。

## 讀取時的未分割合併 (MoR) 資料表
<a name="querying-hudi-nonpartitioned-merge-on-read-table"></a>

以下範例在 Athena 中建立未分割的 MoR 資料表，用於讀取最佳化查詢。請注意，讀取最佳化查詢使用輸入格式 `HoodieParquetInputFormat`。

```
CREATE EXTERNAL TABLE `nonpartition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

下列範例會在 Athena 中建立用於快照查詢的未分割 MoR 資料表。對於快照查詢，請使用輸入格式 `HoodieParquetRealtimeInputFormat`。

```
CREATE EXTERNAL TABLE `nonpartition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

## 讀取時分割合併 (MoR) 資料表
<a name="querying-hudi-partitioned-merge-on-read-table"></a>

下列範例會在 Athena 中建立用於讀取最佳化查詢的分割 MoR 資料表。

```
CREATE EXTERNAL TABLE `partition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_mor` 資料表。

```
ALTER TABLE partition_mor ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```

下列範例會在 Athena 中建立用於快照查詢的分割 MoR 資料表。

```
CREATE EXTERNAL TABLE `partition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat'
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

同樣地，以下 `ALTER TABLE ADD PARTITION` 範例會將兩個分割區新增至範例 `partition_mor_rt` 資料表。

```
ALTER TABLE partition_mor_rt ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```

# 使用 Hudi 中繼資料以提升效能
<a name="querying-hudi-metadata-table"></a>

Apache Hudi 有一個[中繼資料表](https://hudi.apache.org/docs/next/metadata/)，其中包含索引功能，以改善效能，例如檔案列出、使用資料欄統計數字略過資料以及基於 Bloom 篩選條件的索引。

在這些功能中，Athena 目前僅支援檔案列出索引。檔案列出索引可從維護分割區到檔案映射的索引中擷取資訊，進而消除諸如「清單檔案」之類的檔案系統呼叫。這樣就不需要遞迴列出資料表路徑下的每個分割區來查看檔案系統。當您處理大型資料集時，此索引會大幅縮短在寫入和查詢期間取得檔案清單時所產生的延遲。它還可以避免瓶頸，例如 Amazon S3 `LIST` 呼叫上的請求限制限流。

**注意**  
Athena 目前不支援資料略過或 Bloom 篩選索引。

## 啟用 Hudi 中繼資料表
<a name="querying-hudi-metadata-table-enabling-the-hudi-metadata-table"></a>

依預設，以中繼資料表為基礎的檔案清單已停用。若要啟用 Hudi 中繼資料表和相關檔案清單功能，請將 `hudi.metadata-listing-enabled` 資料表屬性設定為 `TRUE`。

**範例**  
下列 `ALTER TABLE SET TBLPROPERTIES` 範例會啟用範例 `partition_cow` 資料表上的中繼資料表。

```
ALTER TABLE partition_cow SET TBLPROPERTIES('hudi.metadata-listing-enabled'='TRUE')
```

## 使用引導程序產生的中繼資料
<a name="querying-hudi-hudi-dataset-table-types-bootstrap"></a>

從 Apache Hudi 版本 0.6.0 開始，引導操作功能可為現有 Parquet 資料集提供更好的效能。引導操作不會重寫資料集，而是只能產生中繼資料，使資料集保持在原位。

您可以使用 Athena，透過引導操作對資料表執行查詢，就像以 Amazon S3 中之資料為基礎的其他資料表一樣。在 `CREATE TABLE` 陳述式中，請在 `LOCATION` 子句中指定 Hudi 資料表路徑。

如需有關在 Amazon EMR 中使用引導操作建立 Hudi 資料表的詳細資訊，請參閱 AWS 大數據部落格中的文章 [Apache Hudi 提供的新功能](https://aws.amazon.com/blogs/big-data/new-features-from-apache-hudi-available-in-amazon-emr/)。

# 其他資源
<a name="querying-hudi-additional-resources"></a>

如需搭配使用 Apache Hudi 與 Athena 的其他資源，請參閱下列資源。

## 影片
<a name="querying-hudi-videos"></a>

下列影片顯示如何使用 Amazon Athena，查詢基於 Amazon S3 的資料湖中已經過讀取最佳化的 Apache Hudi 資料集。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/TVcreqxBaGA/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/TVcreqxBaGA)


## 部落格文章
<a name="querying-hudi-big-data-blogs"></a>

下列 AWS 大數據部落格文章包含如何搭配 Athena 使用 Apache Hudi 的說明。
+ [使用 AWS 資料交換無縫共用 Apache Hudi 資料集](https://aws.amazon.com/blogs/big-data/use-aws-data-exchange-to-seamlessly-share-apache-hudi-datasets/) 
+ [使用 Amazon Kinesis AWS DMS、使用 Quick AWS Glue 串流 ETL 和資料視覺化，建立以 Apache Hudi 為基礎的near-real-time交易資料湖](https://aws.amazon.com/blogs/big-data/create-an-apache-hudi-based-near-real-time-transactional-data-lake-using-aws-dms-amazon-kinesis-aws-glue-streaming-etl-and-data-visualization-using-amazon-quicksight/) 
+ 如需有關使用 AWS Glue 自訂連接器和 AWS Glue 2.0 任務來建立您可以使用 Athena 查詢的 Apache Hudi 資料表的資訊，請參閱[使用 AWS Glue 自訂連接器寫入 Apache Hudi 資料表](https://aws.amazon.com/blogs/big-data/writing-to-apache-hudi-tables-using-aws-glue-connector/)。
+ 如需使用 Apache Hudi AWS Glue和 Amazon Athena 為資料湖建置資料處理架構的文章，請參閱[使用 AWS Glue 和 Apache Hudi 簡化資料湖中的操作資料處理](https://aws.amazon.com/blogs/big-data/simplify-operational-data-processing-in-data-lakes-using-aws-glue-and-apache-hudi/)。

# 查詢 Apache Iceberg 資料表
<a name="querying-iceberg"></a>

您可以使用 Athena 在 Apache Iceberg 資料表上執行讀取、時間歷程、寫入和 DDL 查詢。

[Apache Iceberg](https://iceberg.apache.org/) 是開放式的資料表格式，專用於非常大型的分析資料集。Iceberg 以管理資料表的方式來管理大量的檔案集合並支援新型的分析資料湖操作，如記錄層級的插入、更新、刪除和時間歷程查詢。Iceberg 規格可讓資料表的結構描述和分割區等變化順暢無礙，並專為最佳化 Amazon S3 的使用所設計。Iceberg 也有助於在並行寫入的情況下保證資料的正確性。

如需 Apache Iceberg 的相關詳細資訊，請參閱 [https://iceberg.apache.org/](https://iceberg.apache.org/)。

## 考量和限制
<a name="querying-iceberg-considerations-and-limitations"></a>

Athena 對 Iceberg 資料表的支援有以下考量事項和限制：
+ **Iceberg 版本支援** – Athena 支援 Apache Iceberg 1.4.2 版。
+ **向 Lake Formation 註冊的資料表** – Athena 目前不支援對向 Lake Formation 註冊的 Iceberg 資料表進行 DDL 操作。
+ **針對資訊結構描述的查詢** – 查詢 Iceberg 資料表的資訊結構描述時，Athena 會使用 S3 中繼資料作為資料欄中繼資料的事實來源。這表示資料欄資訊衍生自基礎 S3 檔案，而不是目錄中繼資料。此行為不同於其他資料表格式，其中目錄中繼資料可能是資料欄資訊的主要來源。
+ ** AWS Glue 僅限目錄的資料表** – Athena 僅支援根據開放原始碼黏附 AWS Glue 目錄實作所定義的規格，針對目錄建立的 Iceberg 資料表。 [https://iceberg.apache.org/docs/latest/aws/#glue-catalog](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)
+ ** AWS Glue 僅支援資料表鎖定** – 與支援外掛程式自訂鎖定的開放原始碼 Glue 目錄實作不同，Athena 僅支援 AWS Glue 樂觀鎖定。使用 Athena 修改具有任何其他鎖定實作的 Iceberg 資料表將導致潛在的資料遺失和交易中斷。
+ **支援的檔案格式** – Athena 引擎版本 3 支援下列 Iceberg 檔案格式。
  + Parquet
  + ORC
  + Avro
+ **Iceberg 受限制的中繼資料** – Lake Formation 不會評估 Iceberg 中繼資料資料表。因此，如果基本資料表上有任何 Lake Formation 資料列或儲存格篩選條件，或者您沒有檢視基本資料表中所有資料欄的許可，則 Iceberg 中繼資料資料表會受到限制。在這種情況下，當您查詢 `$partitions`、`$files`、`$manifests` 和 `$snapshots` Iceberg 中繼資料表時，它會失敗並收到 `AccessDeniedException` 錯誤。此外，中繼資料欄 `$path` 具有相同的 Lake Formation 限制，並在查詢選取時會失敗。無論 Lake Formation 篩選條件為何，都可以查詢所有其他中繼資料資料表。如需詳細資訊，請參閱[中繼資料資料表](https://trino.io/docs/current/connector/iceberg.html#metadata-tables)。
+ **Iceberg v2 資料表** – Athena 只能建立及操作 Iceberg v2 資料表。有關 v1 和 v2 資料表之間的區別，請參閱 Apache Iceberg 文件中的[格式版本變更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。
+ **顯示不含時區的時間類型** – 以世界協調時間 (UTC) 顯示不含時區類型的時間和時間戳記。如果在時間資料欄的篩選條件表達式中未指定時區，則使用世界協調時間 (UTC)。
+ **與時間戳記相關的資料精確度** – 雖然 Iceberg 支持時間戳記資料類型的精度達到微秒，但 Athena 僅在讀取和寫入的時間戳記中支持達毫秒的精度。針對在手動壓縮操作過程中重寫的時間相關資料欄中的資料，Athena 僅保留毫秒精度。
+ **不支援的操作** – Iceberg 資料表不支援以下 Athena 操作。
  + [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ **Views** (檢視) – 使用 `CREATE VIEW` 建立 Athena 檢視，如 [使用檢視](views.md) 中所述。如果您有興趣使用 [Iceberg 檢視規格](https://github.com/apache/iceberg/blob/master/format/view-spec.md)來建立檢視，請聯絡 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。
+ ** AWS Lake Formation中不支援 TTF 管理命令** – 雖然您可以使用 Lake Formation 來管理 TransactionTable Formats (TTF) 的讀取存取許可，例如 Apache Iceberg、Apache Hudi 和 Linux Foundation Delta Lake，但您無法使用 Lake Formation 來管理操作的許可，例如使用這些資料表格式的 `VACUUM`、`MERGE`、`UPDATE` 或 `OPTIMIZE`。如需 Lake Formation 與 Athena 整合的詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[搭配使用 AWS Lake Formation 與 Amazon Athena](https://docs.aws.amazon.com/lake-formation/latest/dg/athena-lf.html)。
+ **依巢狀欄位分割** – 不支援依巢狀欄位分割。嘗試這樣做會產生訊息 NOT\$1SUPPORTED：不支援依巢狀欄位分割：*column\$1name*.*nested\$1field\$1name*。
+ **略過不支援的 Amazon Glacier 物件** – 如果 Apache Iceberg 資料表中的物件位於 Amazon Glacier 儲存類別中，則將 `read_restored_glacier_objects` 資料表屬性設定為 `false` 是無效的。

  例如，假設您發出下列命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  對於 Iceberg 和 Delta Lake 資料表，此命令會產生錯誤不支援的資料表屬性索引鍵：read\$1restored\$1glacier\$1objects。對於 Hudi 資料表，`ALTER TABLE` 命令不會產生錯誤，但是 Amazon Glacier 物件仍不會略過。在 `ALTER TABLE` 命令繼續傳回所有物件之後執行 `SELECT` 查詢。

如果您希望 Athena 支援特定功能，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

**Topics**
+ [考量和限制](#querying-iceberg-considerations-and-limitations)
+ [建立 Iceberg 資料表](querying-iceberg-creating-tables.md)
+ [查詢 Iceberg 資料表資料](querying-iceberg-table-data.md)
+ [執行時間歷程和版本歷程查詢](querying-iceberg-time-travel-and-version-travel-queries.md)
+ [更新 Iceberg 資料表資料](querying-iceberg-updating-iceberg-table-data.md)
+ [管理 Iceberg 資料表](querying-iceberg-managing-tables.md)
+ [演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md)
+ [在 Iceberg 資料表上執行其他 DDL 操作](querying-iceberg-additional-operations.md)
+ [最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)
+ [查詢 AWS Glue Data Catalog 具體化視觀表](querying-iceberg-gdc-mv.md)
+ [Athena 中 Iceberg 資料表支援的資料類型](querying-iceberg-supported-data-types.md)
+ [其他資源](querying-iceberg-additional-resources.md)

# 建立 Iceberg 資料表
<a name="querying-iceberg-creating-tables"></a>

若要建立 Iceberg 資料表以在 Athena 中使用，您可以使用此頁面所述的`CREATE TABLE`陳述式，也可以使用 AWS Glue 爬蟲程式。

## 使用 CREATE TABLE 陳述式
<a name="querying-iceberg-creating-tables-query-editor"></a>

Athena 可建立 Iceberg V2 資料表。有關 v1 和 v2 資料表之間的區別，請參閱 Apache Iceberg 文件中的[格式版本變更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。

Athena `CREATE TABLE` 建立一個不含資料的 Iceberg 資料表。如果資料表使用 [Iceberg 開放原始碼 glue 目錄](https://iceberg.apache.org/docs/latest/aws/#glue-catalog)，您可以直接從外部系統 (如 Apache Spark) 查詢資料表。您不必建立外部資料表。

**警告**  
執行 `CREATE EXTERNAL TABLE` 會導致錯誤訊息 External keyword not supported for table type ICEBERG (資料表類型 ICEBERG 不支援外部關鍵字)。

若要在 Athena 中建立 Iceberg 資料表，請在 `TBLPROPERTIES` 子句中將 `'table_type'` 資料表屬性設定成 `'ICEBERG'`，如下列語法摘要所示。

```
CREATE TABLE
  [db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
  [PARTITIONED BY (col_name | transform, ... )]
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' ='ICEBERG' [, property_name=property_value] )
```

如需有關您可在 Iceberg 資料表中查詢之資料類型的資訊，請參閱 [Athena 中 Iceberg 資料表支援的資料類型](querying-iceberg-supported-data-types.md)。

### 使用分割區
<a name="querying-iceberg-partitioning"></a>

若要建立含有分割區的 Iceberg 資料表，請使用 `PARTITIONED BY` 語法。必須先在資料欄聲明中宣告要分割的資料欄。`PARTITIONED BY` 子句中不能包括資料欄類型。您也可以使用 `CREATE TABLE` 語法來定義[分割區轉換](https://iceberg.apache.org/spec/#partition-transforms)。若要指定分割時要使用的多個資料欄，請使用逗號 (`,`) 字元來分隔資料欄，如下列範例所示。

```
CREATE TABLE iceberg_table (id bigint, data string, category string)
  PARTITIONED BY (category, bucket(16, id))
  LOCATION 's3://amzn-s3-demo-bucket/your-folder/'
  TBLPROPERTIES ( 'table_type' = 'ICEBERG' )
```

下表顯示可用的分割區轉換函數。


****  

| 函式 | Description | 支援的類型 | 
| --- | --- | --- | 
| year(ts) | 按年分割區 | date, timestamp | 
| month(ts) | 按月分割區 | date, timestamp | 
| day(ts)  | 按日分割區 | date, timestamp | 
| hour(ts) | 按小時分割區 | timestamp | 
| bucket(N, col) | 按雜湊值模組 N 儲存貯體分割區。這與 Hive 資料表的雜湊儲存貯體具有相同的概念。 | int, long, decimal, date, timestamp, string, binary  | 
| truncate(L, col) | 按截斷至 L 的值分割區 | int, long, decimal, string | 

Athena 支援 Iceberg 的隱藏分割。如需詳細資訊，請參閱 Apache Iceberg 文件中的 [Iceberg 隱藏分割](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)。

### 指定資料表屬性
<a name="querying-iceberg-table-properties"></a>

本節說明可在 `CREATE TABLE` 陳述式的 `TBLPROPERTIES` 子句中指定為鍵值對的資料表屬性。Athena 僅允許使用預先定義之資料表屬性清單中的鍵值對來建立或更改 Iceberg 資料表。下表顯示您可指定的資料表屬性。如需有關壓縮選項的詳細資訊，請參閱本文件中的 [最佳化 Iceberg 資料表](querying-iceberg-data-optimization.md)。如果您希望 Athena 支援特定的開放原始碼資料表組態屬性，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

***format***


****  

|  |  | 
| --- |--- |
| Description | 檔案資料格式 | 
| 允許的屬性值 | 支援的檔案格式和壓縮組合會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。 | 
| 預設值 | parquet | 

***write\$1compression***


****  

|  |  | 
| --- |--- |
| Description | 檔案壓縮轉碼器 | 
| 允許的屬性值 | 支援的檔案格式和壓縮組合會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。 | 
| 預設值 |  預設寫入壓縮會隨 Athena 引擎版本而異。如需詳細資訊，請參閱[使用 Iceberg 資料表壓縮](compression-support-iceberg.md)。  | 

***optimize\$1rewrite\$1data\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Description | 資料最佳化的專用組態。如果需要最佳化的資料檔案少於指定的閾值，則不會重寫這些檔案。這允許累積更多的資料檔案，從而產生更接近目標大小的檔案，並略過不必要的運算以節省成本。 | 
| 允許的屬性值 | 正數。必須小於 50。 | 
| 預設值 | 5 | 

***optimize\$1rewrite\$1delete\$1file\$1threshold***


****  

|  |  | 
| --- |--- |
| Description | 資料最佳化的專用組態。如果與資料檔案關聯的刪除檔案少於閾值，則不會重寫資料檔案。這允許為每個資料檔案累積更多的刪除檔案，從而節省成本。 | 
| 允許的屬性值 | 正數。必須小於 50。 | 
| 預設值 | 2 | 

***vacuum\$1min\$1snapshots\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Description |  要保留在資料表主要分支上的快照數目下限。 此值優先於 `vacuum_max_snapshot_age_seconds` 屬性。如果最小剩餘快照早於 `vacuum_max_snapshot_age_seconds` 指定的期限，則會保留快照，且會忽略 `vacuum_max_snapshot_age_seconds` 的值。  | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 1 | 

***vacuum\$1max\$1snapshot\$1age\$1seconds***


****  

|  |  | 
| --- |--- |
| Description | 要在主分支上保留的快照最長期限。如果由 vacuum\$1min\$1snapshots\$1to\$1keep 指定的剩餘最小快照早於指定的期限，則會忽略此值。此資料表行為屬性可與 Apache Iceberg 組態中的 history.expire.max-snapshot-age-ms 屬性相對應。 | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 432,000 秒 (5 天) | 

***vacuum\$1max\$1metadata\$1files\$1to\$1keep***


****  

|  |  | 
| --- |--- |
| Description | 要在資料表的主要分支上保留的先前中繼資料檔案數目上限。 | 
| 允許的屬性值 | 正數。 | 
| 預設值 | 100 | 

***write\$1data\$1path\$1enabled***


****  

|  |  | 
| --- |--- |
| Description | 設為 時true，會使用 write.data.path 屬性建立 Iceberg 資料表，而不是已取代的 write.object-storage.path 屬性。使用此選項可確保與 Iceberg 1.9.0 和更新版本相容，後者不再支援已棄用屬性。 | 
| 允許的屬性值 | true, false | 
| 預設值 | false | 

### CREATE TABLE 陳述式範例
<a name="querying-iceberg-example-create-table-statement"></a>

下列範例會建立具有三個資料欄的 Iceberg 資料表。

```
CREATE TABLE iceberg_table (
  id int,
  data string,
  category string) 
PARTITIONED BY (category, bucket(16,id)) 
LOCATION 's3://amzn-s3-demo-bucket/iceberg-folder' 
TBLPROPERTIES (
  'table_type'='ICEBERG',
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

## 使用 CREATE TABLE AS SELECT (CTAS)
<a name="querying-iceberg-creating-tables-ctas"></a>

如需使用 `CREATE TABLE AS` 陳述式建立 Iceberg 資料表的相關資訊，請參閱 [CREATE TABLE AS](create-table-as.md)，特別注意 [CTAS 資料表屬性](create-table-as.md#ctas-table-properties) 一節。

## 使用 AWS Glue 爬蟲程式
<a name="querying-iceberg-creating-tables-crawler"></a>

您可以使用 AWS Glue 爬蟲程式自動將 Iceberg 資料表註冊到 AWS Glue Data Catalog。如果您想要從另一個 Iceberg 目錄遷移，您可以建立和排程 AWS Glue 爬蟲程式，並提供 Iceberg 資料表所在的 Amazon S3 路徑。您可以指定 AWS Glue 爬蟲程式可周遊的 Amazon S3 路徑的深度上限。排程 AWS Glue 爬蟲程式之後，爬蟲程式會擷取結構描述資訊，並在每次執行時 AWS Glue Data Catalog 以結構描述變更更新 。 AWS Glue 爬蟲程式支援跨快照合併結構描述，並更新 中的最新中繼資料檔案位置 AWS Glue Data Catalog。如需詳細資訊，請參閱 [中的資料目錄和爬蟲程式 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。

# 查詢 Iceberg 資料表資料
<a name="querying-iceberg-table-data"></a>

若要查詢 Iceberg 資料集，請使用標準 `SELECT` 陳述式，如下所示。查詢會遵循 Apache Iceberg [V2 格式規格](https://iceberg.apache.org/spec/#format-versioning)並在兩方位置執行讀取時合併且刪除相同項目。

```
SELECT * FROM [db_name.]table_name [WHERE predicate]
```

為了盡量縮短查詢時間，所有述詞都會被推送到資料所在的位置。

如需有關時間歷程和版本歷程查詢的資訊，請參閱 [執行時間歷程和版本歷程查詢](querying-iceberg-time-travel-and-version-travel-queries.md)。

## 使用 Iceberg 資料表建立和查詢檢視
<a name="querying-iceberg-views"></a>

若要在 Iceberg 資料表上建立和查詢 Athena 檢視，請遵循 [使用檢視](views.md) 中所述使用 `CREATE VIEW` 檢視。

範例：

```
CREATE VIEW view1 AS SELECT * FROM iceberg_table
```

```
SELECT * FROM view1 
```

如果您有興趣使用 [Iceberg 檢視規格](https://github.com/apache/iceberg/blob/master/format/view-spec.md)來建立檢視，請聯絡 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 查詢 Iceberg 資料表中繼資料
<a name="querying-iceberg-table-metadata"></a>

在 `SELECT` 查詢中，您可以在 *table\$1name* 之後使用下列屬性來查詢 Iceberg 資料表中繼資料：
+ **\$1files** – 顯示資料表的目前資料檔案。
+ **\$1manifests** – 顯示資料表的目前檔案清單檔案。
+ **\$1history** – 顯示資料表的歷程記錄。
+ **\$1partitions** – 顯示資料表的目前分割區。
+ **\$1snapshots** – 顯示資料表的快照。
+ **\$1refs** – 顯示資料表的參考。

### 範例
<a name="querying-iceberg-table-metadata-syntax"></a>

下列陳述式會列出 Iceberg 資料表的檔案。

```
SELECT * FROM "dbname"."tablename$files"
```

下列陳述式會列出 Iceberg 資料表的清單檔案。

```
SELECT * FROM "dbname"."tablename$manifests" 
```

下列陳述式會顯示 Iceberg 資料表的歷程記錄。

```
SELECT * FROM "dbname"."tablename$history"
```

下列範例會顯示 Iceberg 資料表的分割區。

```
SELECT * FROM "dbname"."tablename$partitions" 
```

下列範例會列出 Iceberg 資料表的快照。

```
SELECT * FROM "dbname"."tablename$snapshots" 
```

下列範例會顯示 Iceberg 資料表的參考。

```
SELECT * FROM "dbname"."tablename$refs" 
```

## 使用 Lake Formation 精細存取控制
<a name="querying-iceberg-working-with-lf-fgac"></a>

Athena 引擎版本 3 支援 Lake Formation 與 Iceberg 資料表的精細存取控制，包括資料欄層級和資料列層級的安全存取控制。此存取控制適用於時間歷程查詢及已執行結構描述演變的資料表。如需詳細資訊，請參閱[Lake Formation 精細存取控制和 Athena 工作群組](lf-athena-limitations.md#lf-athena-limitations-fine-grained-access-control)。

如果您在 Athena 外部建立了 Iceberg 資料表，則請使用 [Apache Iceberg SDK](https://iceberg.apache.org/releases/) 版本 0.13.0 或更高版本，以便將您的 Iceberg 資料表資料欄資訊填入 AWS Glue Data Catalog。如果您的 Iceberg 資料表不包含 中的資料欄資訊 AWS Glue，您可以使用 Athena [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)陳述式或最新的 Iceberg SDK 來修正資料表並更新其中的資料欄資訊 AWS Glue。

# 執行時間歷程和版本歷程查詢
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

每個 Apache Iceberg 資料表都會有一份其所含 Amazon S3 物件的版本資訊清單。使用過往的版本資訊清單可查詢時間歷程和版本歷程。

Athena 中的時間歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定日期和時間的資料，歷程資料會統一顯示成一個快照。Athena 中的版本歷程查詢可在 Simple Storage Service (Amazon S3) 中查詢截至某個指定快照 ID 的歷程資料。

## 時間歷程查詢
<a name="querying-iceberg-time-travel-queries"></a>

若要執行時間歷程查詢，請在 `SELECT` 陳述式的資料表名稱後加上 `FOR TIMESTAMP AS OF timestamp`，如下列範例所示。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp
```

進行歷程查詢時所要指定的系統時間是時間戳記或含時區的時間戳記。如果沒有指定時間，則 Athena 會假設該值為世界協調時間 (UTC) 的時間戳記。

下列時間歷程查詢範例會選擇指定日期和時間的 CloudTrail 資料。

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2020-01-01 10:00:00 UTC'
```

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)
```

## 版本歷程查詢
<a name="querying-iceberg-version-travel-queries"></a>

若要執行版本歷程查詢 (即查看指定版本統一顯示的快照)，請在 `SELECT` 陳述式中的資料表名稱後加上 `FOR VERSION AS OF version`，如下列範例所示。

```
SELECT * FROM [db_name.]table_name FOR VERSION AS OF version         
```

*版本*參數是與 Iceberg 資料表版本相關的 `bigint` 快照 ID。

下列範例的版本歷程查詢會選擇指定版本的資料。

```
SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
```

**注意**  
Athena 引擎版本 2 版中的 `FOR SYSTEM_TIME AS OF` 和 `FOR SYSTEM_VERSION AS OF` 子句已由 Athena 引擎版本 3 中的 `FOR TIMESTAMP AS OF` and `FOR VERSION AS OF` 子句取代。

### 擷取快照 ID
<a name="querying-iceberg-table-snapshot-id"></a>

您可以使用 Iceberg 提供的 Java [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) 類別來擷取 Iceberg 快照 ID，如下列範例所示。

```
import org.apache.iceberg.Table;
import org.apache.iceberg.aws.glue.GlueCatalog;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.util.SnapshotUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

Catalog catalog = new GlueCatalog();

Map<String, String> properties = new HashMap<String, String>();
properties.put("warehouse", "s3://amzn-s3-demo-bucket/my-folder");
catalog.initialize("my_catalog", properties);

Date date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2022/01/01 00:00:00");
long millis = date.getTime();

TableIdentifier name = TableIdentifier.of("db", "table");
Table table = catalog.loadTable(name);
long oldestSnapshotIdAfter2022 = SnapshotUtil.oldestAncestorAfter(table, millis);
```

## 結合時間和版本歷程
<a name="querying-iceberg-combining-time-and-version-travel"></a>

您可在同一查詢中使用時間歷程查詢和版本歷程查詢語法來指定不同的時間和版本控制條件，如下列範例所示。

```
SELECT table1.*, table2.* FROM 
  [db_name.]table_name FOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 
  FULL JOIN 
  [db_name.]table_name FOR VERSION AS OF 5487432386996890161 AS table2 
  ON table1.ts = table2.ts 
  WHERE (table1.id IS NULL OR table2.id IS NULL)
```

# 更新 Iceberg 資料表資料
<a name="querying-iceberg-updating-iceberg-table-data"></a>

您可以使用 `INSERT`、`UPDATE` 和 `DELETE` 查詢，直接在 Athena 上管理 Iceberg 資料表資料。每次資料管理異動都會產生新的快照，使用時間歷程查詢可查詢此快照。`UPDATE` 和 `DELETE` 陳述式遵循 Iceberg v2 格式的資料列級[位置刪除](https://iceberg.apache.org/spec/#position-delete-files)規格，並強制執行快照隔離。

**注意**  
Athena SQL 目前不支援寫入時複製方法。無論指定的資料表屬性為何，`UPDATE`、`MERGE INTO` 和 `DELETE FROM` 操作一律使用讀取時合併方法和位置刪除。如果您已設定資料表屬性 (例如 `write.update.mode`、`write.merge.mode` 及/或 `write.delete.mode` 以使用寫入時複製)，則您的查詢不會失敗，因為 Athena 會忽略它們並繼續使用讀取時合併。

使用以下命令對 Iceberg 資料表執行資料管理操作。

**Topics**
+ [INSERT INTO](querying-iceberg-insert-into.md)
+ [DELETE](querying-iceberg-delete.md)
+ [UPDATE](querying-iceberg-update.md)
+ [合併為](querying-iceberg-merge-into.md)

# INSERT INTO
<a name="querying-iceberg-insert-into"></a>

將資料插入 Iceberg 資料表。Athena Iceberg `INSERT INTO` 的收費與目前針對外部 Hive 資料表的 `INSERT INTO` 查詢相同，即按掃描的資料量收費。若要將資料插入 Iceberg 資料表，請使用以下語法，其中*查詢*可能是 `VALUES (val1, val2, ...)` 或 `SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate`。如需有關 SQL 語法和語意的詳細資訊，則請參閱 [INSERT INTO](insert-into.md)。

```
INSERT INTO [db_name.]table_name [(col1, col2, …)] query
```

下列範例會將值插入資料表 `iceberg_table` 中。

```
INSERT INTO iceberg_table VALUES (1,'a','c1')
```

```
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
```

```
INSERT INTO iceberg_table SELECT * FROM another_table
```

# DELETE
<a name="querying-iceberg-delete"></a>

Athena Iceberg `DELETE` 將 Iceberg 位置刪除檔案寫入資料表。這稱為讀取時合併刪除。與寫入時複製刪除不同，讀取時合併刪除效率更高，因為它不會重寫檔案資料。當 Athena 讀取 Iceberg 資料時，它將 Iceberg 位置刪除檔案與資料檔案合併，以產生資料表的最新檢視。若要刪除這些位置刪除檔案，您可以執行[重寫資料壓縮動作](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action)。`DELETE` 操作將按掃描的資料量計費。如需語法，請參閱[DELETE](delete-statement.md)。

下列範例會刪除 `iceberg_table` 中 `category` 值為 `c3` 的資料列。

```
DELETE FROM iceberg_table WHERE category='c3'
```

# UPDATE
<a name="querying-iceberg-update"></a>

Athena Iceberg `UPDATE` 將 Iceberg 位置刪除檔案和最新更新的資料列寫為相同交易中的資料檔案。`UPDATE` 可以想象為 `INSERT INTO` 和 `DELETE`。`UPDATE` 操作將按掃描的資料量計費。如需語法，請參閱[UPDATE](update-statement.md)。

下列範例會更新資料表 `iceberg_table` 中的指定值。

```
UPDATE iceberg_table SET category='c2' WHERE category='c1'
```

# 合併為
<a name="querying-iceberg-merge-into"></a>

有條件地更新、刪除資料列或將其插入至 Iceberg 資料表。單一陳述式可以組合更新、刪除和插入動作。如需語法，請參閱[合併為](merge-into-statement.md)。

**注意**  
`MERGE INTO` 是交易型的並且僅由 Athena 引擎版本 3 中的 Apache Iceberg 資料表支援。

下列範例會從來源資料表 `s` 中的資料表 `t` 刪除所有客戶。

```
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
```

下列範例會使用來源資料表 `s` 中的客戶資訊更新目標資料表 `t`。對於資料表 `s` 中具有相符客戶資料列之資料表 `t` 中的客戶資料列，此範例會在資料表 t 中遞增購買項目。如果資料表 `t` 與資料表 `s` 中的客戶資料列不相符，則該範例會將客戶資料列從資料表 `s` 插入到資料表 `t` 中。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED
        THEN UPDATE SET purchases = s.purchases + t.purchases
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

下列範例會使用來源資料表 `s` 中的資訊偶爾更新目標資料表 `t`。此範例會刪除來源地址為森特維爾的任何相符的目標資料列。對於所有其他相符的資料列，此範例會新增來源購買項目，並將目標地址設定為來源地址。如果目標資料表中沒有相符項目，則範例會從來源資料表插入資料列。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED AND s.address = 'Centreville'
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE
            SET purchases = s.purchases + t.purchases, address = s.address
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

# 管理 Iceberg 資料表
<a name="querying-iceberg-managing-tables"></a>

Athena 支援 Iceberg 資料表的以下資料表 DDL 操作。

**Topics**
+ [ALTER TABLE RENAME](querying-iceberg-alter-table-rename.md)
+ [ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md)
+ [ALTER TABLE UNSET TBLPROPERTIES](querying-iceberg-alter-table-unset-properties.md)
+ [DESCRIBE](querying-iceberg-describe-table.md)
+ [DROP TABLE](querying-iceberg-drop-table.md)
+ [SHOW CREATE TABLE](querying-iceberg-show-create-table.md)
+ [SHOW TBLPROPERTIES](querying-iceberg-show-table-properties.md)

# ALTER TABLE RENAME
<a name="querying-iceberg-alter-table-rename"></a>

重新命名資料表。

由於 Iceberg 資料表的資料表中繼資料存放在 Amazon S3 中，因此您可以更新 Iceberg 受管資料表的資料庫和資料表名稱，而不會影響基礎資料表資訊。

## 概要
<a name="querying-iceberg-alter-table-rename-synopsis"></a>

```
ALTER TABLE [db_name.]table_name RENAME TO [new_db_name.]new_table_name
```

## 範例
<a name="querying-iceberg-alter-table-rename-example"></a>

```
ALTER TABLE my_db.my_table RENAME TO my_db2.my_table2
```

# ALTER TABLE SET TBLPROPERTIES
<a name="querying-iceberg-alter-table-set-properties"></a>

新增 Iceberg 資料表的屬性並設定他們的指定值。

根據 [Iceberg 規格](https://iceberg.apache.org/#spec/#table-metadata-fields)，資料表屬性會儲存在 Iceberg 資料表中繼資料檔案中，而不是儲存在 AWS Glue中。Athena 不接受自訂資料表屬性。有關允許使用的鍵值對，請參閱 [指定資料表屬性](querying-iceberg-creating-tables.md#querying-iceberg-table-properties) 部分。您也可以使用 `ALTER TABLE SET TBLPROPERTIES`和 `ALTER TABLE UNSET TBLPROPERTIES` 來設定或移除 `write.data.path`和 `write.object-storage.path` Iceberg 資料表屬性。如果您希望 Athena 支援特定的開放原始碼資料表組態屬性，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 概要
<a name="querying-iceberg-alter-table-set-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## 範例
<a name="querying-iceberg-alter-table-set-properties-example"></a>

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'format'='parquet',
  'write_compression'='snappy',
  'optimize_rewrite_delete_file_threshold'='10'
)
```

下列範例會在現有的 Iceberg 資料表上設定 `write.data.path` 屬性。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'write.data.path'='s3://amzn-s3-demo-bucket/your-folder/data'
)
```

# ALTER TABLE UNSET TBLPROPERTIES
<a name="querying-iceberg-alter-table-unset-properties"></a>

捨棄 Iceberg 資料表的現有屬性。

## 概要
<a name="querying-iceberg-alter-table-unset-properties-synopsis"></a>

```
ALTER TABLE [db_name.]table_name UNSET TBLPROPERTIES ('property_name' [ , ... ])
```

## 範例
<a name="querying-iceberg-alter-table-unset-properties-example"></a>

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write_compression')
```

下列範例會從 Iceberg 資料表移除 `write.data.path` 屬性。

```
ALTER TABLE iceberg_table UNSET TBLPROPERTIES ('write.data.path')
```

# DESCRIBE
<a name="querying-iceberg-describe-table"></a>

描述資料表資訊。

## 概要
<a name="querying-iceberg-describe-table-synopsis"></a>

```
DESCRIBE [FORMATTED] [db_name.]table_name
```

當指定 `FORMATTED` 選項時，輸出會顯示資料表位置和屬性等其他資訊。

## 範例
<a name="querying-iceberg-describe-table-example"></a>

```
DESCRIBE iceberg_table
```

# DROP TABLE
<a name="querying-iceberg-drop-table"></a>

捨棄 Iceberg 資料表。

**警告**  
因為 Iceberg 資料表在 Athena 中被視為受管資料表，因此捨棄 Iceberg 資料表也會刪除資料表中的所有資料。

## 概要
<a name="querying-iceberg-drop-table-synopsis"></a>

```
DROP TABLE [IF EXISTS] [db_name.]table_name
```

## 範例
<a name="querying-iceberg-drop-table-example"></a>

```
DROP TABLE iceberg_table
```

# SHOW CREATE TABLE
<a name="querying-iceberg-show-create-table"></a>

顯示可用於在 Athena 中重新建立 Iceberg 資料表的 `CREATE TABLE` DDL 陳述式。如果 Athena 無法重現資料表結構 (例如，由於在資料表中指定了自訂資料表屬性)，則會擲回 UNSUPPORTED (不受支援的) 錯誤。

## 概要
<a name="querying-iceberg-show-create-table-synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## 範例
<a name="querying-iceberg-show-create-table-example"></a>

```
SHOW CREATE TABLE iceberg_table
```

# SHOW TBLPROPERTIES
<a name="querying-iceberg-show-table-properties"></a>

顯示 Iceberg 資料表的一個或多個資料表屬性。僅顯示 Athena 支援的資料表屬性。

## 概要
<a name="querying-iceberg-show-table-properties-synopsis"></a>

```
SHOW TBLPROPERTIES [db_name.]table_name [('property_name')]
```

## 範例
<a name="querying-iceberg-show-table-properties-example"></a>

```
SHOW TBLPROPERTIES iceberg_table
```

# 演進 Iceberg 資料表結構描述
<a name="querying-iceberg-evolving-table-schema"></a>

Iceberg 結構描述更新只會變更中繼資料。執行結構描述更新時，不會更改任何資料檔案。

Iceberg 格式支持以下結構描述的變化：
+ **Add** – 在資料表或巢狀 `struct` 中新增資料欄。
+ **Drop** – 在資料表或巢狀 `struct` 中移除現有的資料欄。
+ **Rename** – 重新命名巢狀 `struct` 中現有的資料欄或欄位。
+ **Reorder** – 變更資料欄的順序。
+  **Type promotion** – 增加可用的資料欄、`struct` 欄位、`map` 鍵、`map` 值或 `list` 元素類型。目前，Iceberg 資料表會支援以下情況：
  + 整數到大整數
  + float 到 double
  + 增加十進制類型的精度

您可以使用本節中的 DDL 陳述式來修改 Iceberg 資料表結構描述。

**Topics**
+ [ALTER TABLE ADD COLUMNS](querying-iceberg-alter-table-add-columns.md)
+ [ALTER TABLE DROP COLUMN](querying-iceberg-alter-table-drop-column.md)
+ [ALTER TABLE CHANGE COLUMN](querying-iceberg-alter-table-change-column.md)
+ [SHOW COLUMNS](querying-iceberg-show-columns.md)

# ALTER TABLE ADD COLUMNS
<a name="querying-iceberg-alter-table-add-columns"></a>

在現有資料表中新增一或多個資料欄。

## 概要
<a name="querying-iceberg-alter-table-add-columns-synopsis"></a>

```
ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type [,...])
```

## 範例
<a name="querying-iceberg-alter-table-add-columns-example"></a>

下列範例會將 `string` 類型的 `comment` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table ADD COLUMNS (comment string)
```

下列範例會將 `struct` 類型的 `point` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (point struct<x: double, y: double>)
```

下列範例會將結構的陣列 `points` 資料欄新增至 Iceberg 資料表。

```
ALTER TABLE iceberg_table 
ADD COLUMNS (points array<struct<x: double, y: double>>)
```

# ALTER TABLE DROP COLUMN
<a name="querying-iceberg-alter-table-drop-column"></a>

捨棄 Iceberg 資料表的資料欄。

## 概要
<a name="querying-iceberg-alter-table-drop-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name DROP COLUMN col_name
```

## 範例
<a name="querying-iceberg-alter-table-drop-column-example"></a>

```
ALTER TABLE iceberg_table DROP COLUMN userid
```

# ALTER TABLE CHANGE COLUMN
<a name="querying-iceberg-alter-table-change-column"></a>

變更 Iceberg 資料表中資料欄的名稱、類型、順序或註解。

**注意**  
不支援 `ALTER TABLE REPLACE COLUMNS`。由於 `REPLACE COLUMNS` 會刪除所有資料欄，然後新增新的資料欄，則不支援 Iceberg。`CHANGE COLUMN` 是結構描述變化的偏好語法。

## 概要
<a name="querying-iceberg-alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 範例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
ALTER TABLE iceberg_table CHANGE comment blog_comment string AFTER id
```

# SHOW COLUMNS
<a name="querying-iceberg-show-columns"></a>

顯示資料表中的資料欄。

## 概要
<a name="querying-iceberg-show-columns-synopsis"></a>

```
SHOW COLUMNS (FROM|IN) [db_name.]table_name
```

## 範例
<a name="querying-iceberg-alter-table-change-column-example"></a>

```
SHOW COLUMNS FROM iceberg_table
```

# 在 Iceberg 資料表上執行其他 DDL 操作
<a name="querying-iceberg-additional-operations"></a>

除了 [演進 Iceberg 資料表結構描述](querying-iceberg-evolving-table-schema.md) 中所述的結構描述演變操作之外，您也可以在 Athena 中的 Apache Iceberg 資料表上執行下列 DDL 操作。

## 資料庫層級操作
<a name="querying-iceberg-additional-operations-database-level-operations"></a>

當您搭配使用 [DROP DATABASE](drop-database.md) 與 `CASCADE` 選項時，則任何 Iceberg 資料表資料也會被刪除。以下 DDL 操作對 Iceberg 資料表沒有影響。
+ [CREATE DATABASE](create-database.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW VIEWS](show-views.md)

## 分割區相關操作
<a name="querying-iceberg-additional-operations-partition-related-operations"></a>

因為 Iceberg 資料表使用[隱藏的分割](https://iceberg.apache.org/docs/latest/partitioning/#icebergs-hidden-partitioning)，您不必直接使用實體分割區。因此，Athena 中的 Iceberg 資料表不支援以下與分割區相關的 DDL 操作：
+ [SHOW PARTITIONS](show-partitions.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)

如果您希望查看 Athena 中的 Iceberg [分割區演變](https://iceberg.apache.org/docs/latest/evolution/#partition-evolution)，請將意見回饋傳送至 [athena-feedback@amazon.com](mailto:athena-feedback@amazon.com)。

## 卸載 Iceberg 資料表
<a name="querying-iceberg-additional-operations-unload-iceberg-table"></a>

Iceberg 資料表可以卸載至 Amazon S3 上資料夾中的檔案。如需相關資訊，請參閱[UNLOAD](unload.md)。

## MSCK REPAIR
<a name="querying-iceberg-additional-operations-msck-repair"></a>

由於 Iceberg 資料表會追蹤資料表配置資訊，因此不必也不支援像使用 Hive 資料表那樣執行 [MSCK REPAIR TABLE](msck-repair-table.md)。

# 最佳化 Iceberg 資料表
<a name="querying-iceberg-data-optimization"></a>

Athena 提供多種最佳化功能，可改善 Apache Iceberg 資料表上的查詢效能。隨著資料累積，由於檔案處理開銷增加，以及套用儲存在 Iceberg 刪除檔案中的資料列層級刪除的運算成本增加，查詢效率可能會降低。為了解決這些挑戰，Athena 支援手動壓縮和清空運算子，以最佳化資料表結構。Athena 也使用 Iceberg 統計資料來啟用成本型查詢最佳化和 Parquet 資料欄索引，以便在查詢執行期間精確刪除資料。這些功能可共同運作，以減少查詢執行時間、將資料掃描降至最低，並降低成本。本主題說明如何使用這些最佳化功能來維護 Iceberg 資料表上的高效能查詢。

## OPTIMIZE
<a name="querying-iceberg-data-optimization-rewrite-data-action"></a>

`OPTIMIZE table REWRITE DATA` 壓縮動作會根據相關 delete 檔案的大小和數量，將資料檔案重寫成更好的版面配置。如需有關語法和資料表屬性的詳細資訊，則請參閱 [OPTIMIZE](optimize-statement.md)。

### 範例
<a name="querying-iceberg-data-optimization-example"></a>

下列範例將 delete 檔案合併到資料檔案中，並產生接近目標檔案大小的檔案，其中 `category` 的值是 `c1`。

```
OPTIMIZE iceberg_table REWRITE DATA USING BIN_PACK
  WHERE category = 'c1'
```

## VACUUM
<a name="querying-iceberg-vacuum"></a>

`VACUUM` 會執行[快照過期](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)和[孤立檔案移除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)。這些動作會減少中繼資料大小，並移除不在目前資料表狀態的檔案，這些檔案也早於為資料表指定的保留期間。如需有關語法的詳細資訊，則請參閱 [VACUUM](vacuum-statement.md)。

### 範例
<a name="querying-iceberg-vacuum-example"></a>

下列範例會使用資料表屬性來將資料表 `iceberg_table` 設定為保留最近三天的資料，然後使用 `VACUUM` 將舊快照集設為過期，並從資料表中移除孤立檔案。

```
ALTER TABLE iceberg_table SET TBLPROPERTIES (
  'vacuum_max_snapshot_age_seconds'='259200'
)

VACUUM iceberg_table
```

## 使用 Iceberg 資料表統計資料
<a name="querying-iceberg-data-optimization-statistics"></a>

Athena 的成本型最佳化工具使用 Iceberg 統計資料來產生最佳查詢計劃。為您的 Iceberg 資料表產生統計資料後，Athena 會自動使用此資訊來做出有關聯結排序、篩選條件和彙總行為的智慧型決策，通常可改善查詢效能並降低成本。

當您使用 S3 Tables 時，預設會開啟 Iceberg 統計資料。對於其他 Iceberg 資料表，Athena 會使用資料表屬性`use_iceberg_statistics`來判斷是否利用統計資料進行成本型最佳化。若要開始使用，請參閱*AWS Glue 《 使用者指南*》中的[使用資料欄統計資料最佳化查詢效能](https://docs.aws.amazon.com//glue/latest/dg/column-statistics.html)，或使用 [Athena 主控台](https://docs.aws.amazon.com/athena/latest/ug/cost-based-optimizer.html)在 Iceberg 資料表上產生隨需統計資料。

## 使用 Parquet 資料欄索引
<a name="querying-iceberg-data-optimization-parquet-column-indexing"></a>

Parquet 資料欄索引除了資料列群組層級統計資料之外，還利用頁面層級的最小/最大統計資料，讓 Athena 能夠在查詢執行期間執行更精確的資料刪除。這可讓 Athena 略過資料列群組中不必要的頁面，大幅減少掃描的資料量並改善查詢效能。它最適合對排序資料欄使用選擇性篩選條件述詞的查詢，改善執行時間和資料掃描效率，同時減少 Athena 從 Amazon S3 讀取所需的資料量。

如果基礎 Parquet 檔案中存在資料欄索引，則 Athena 預設會將 Parquet 資料欄索引與 S3 Tables 搭配使用。對於其他 Iceberg 資料表，Athena 會使用 `use_iceberg_parquet_column_index` 屬性來決定是否使用 Parquet 檔案中的資料欄索引。使用 AWS Glue 主控台或 `UpdateTable` API 設定此資料表屬性。

# 查詢 AWS Glue Data Catalog 具體化視觀表
<a name="querying-iceberg-gdc-mv"></a>

Athena 可讓您查詢 AWS Glue Data Catalog 具體化視觀表。Glue Data Catalog 具體化檢視會將 SQL 查詢的預先計算結果儲存為 Apache Iceberg 資料表。

當您在 Amazon EMR 中使用 Apache Spark 建立 Glue Data Catalog 具體化視觀表時 AWS Glue，視觀表定義和中繼資料會存放在 AWS Glue Data Catalog 中。預先計算的結果會儲存為 Amazon S3 中的 Apache Iceberg 資料表。您可以使用標準 SQL `SELECT`陳述式從 Athena 查詢這些具體化視觀表，就像查詢一般 Iceberg 資料表一樣。

## 先決條件
<a name="querying-iceberg-gdc-mv-prerequisites"></a>

在 Athena 中查詢具體化視觀表之前，請確定下列事項：
+ 具體化視觀表存在於 AWS Glue 資料目錄中，並使用 Apache Spark (Amazon EMR 7.12.0 版或更新版本，或 5.1 AWS Glue 版或更新版本） 建立
+ 若要在 Athena 中查詢具體化視觀表，您需要下列 AWS Lake Formation 許可：
  + `SELECT` 具體化檢視的 許可
  + `DESCRIBE` 具體化檢視的 許可
  + 存取存放具體化檢視資料的基礎 Amazon S3 位置
+ 具體化視觀表的基礎資料存放在 Amazon S3 Table 儲存貯體或 Amazon S3 一般用途儲存貯體中
+ 您可以存取包含具體化檢視的 AWS Glue Data Catalog 資料庫
+ 對於存放在 Amazon S3 Tables 儲存貯體中的具體化視觀表，請確保您的 IAM 角色具有存取 S3 Tables 目錄的必要許可。

## 考量和限制
<a name="querying-iceberg-gdc-mv-considerations"></a>
+ Athena 不支援具體化視觀表的下列操作：`ALTER`、`CREATE MATERIALIZED VIEW`、`REFRESH MATERIALIZED VIEW`、`DROP``INSERT`、、`UPDATE`、`MERGE``DELETE`、`OPTIMIZE`、、`VACUUM`、。若要建立具體化視觀表，請在 Amazon EMR 或 中使用 Apache Spark AWS Glue。重新整理操作必須透過 AWS Glue Data Catalog API 或 Apache Spark 執行。使用 Apache Spark 修改具體化視觀表。

## 查詢具體化視觀表
<a name="querying-iceberg-gdc-mv-operations"></a>

Athena 將具體化視觀表視為讀取操作的標準 Iceberg 資料表，可讓您存取預先運算的資料，而不需要特殊語法或組態變更。

若要在 Athena 中查詢具體化視觀表，請使用標準`SELECT`陳述式：

```
SELECT * FROM my_database.sales_summary_mv;
```

您可以套用篩選條件、彙總和聯結，就像使用一般資料表一樣：

```
SELECT
  region,
  SUM(total_sales) as sales_total
FROM my_database.sales_summary_mv
WHERE year = 2025
GROUP BY region
ORDER BY sales_total DESC;
```

## 受支援的操作
<a name="querying-iceberg-gdc-mv-supported"></a>

Athena 支援具體化視觀表的下列操作：
+ `SELECT` 查詢 - 使用標準 SQL `SELECT`陳述式從具體化視觀表讀取資料
+ `DESCRIBE` - 檢視具體化視觀表的結構描述和中繼資料
+ `SHOW TABLES` - 列出具體化視觀表以及資料庫中的其他資料表
+ `JOIN` 操作 - 將具體化視觀表與其他資料表或視觀表聯結
+ 篩選和彙總 - 套用`WHERE`子句`GROUP BY`、 和彙總函數

# Athena 中 Iceberg 資料表支援的資料類型
<a name="querying-iceberg-supported-data-types"></a>

Athena 可以查詢包含下列資料類型的 Iceberg 資料表：

```
binary
boolean
date
decimal
double
float
int
list
long
map
string
struct
timestamp without time zone
```

如需有關 Iceberg 資料表類型的詳細資訊，請參閱 Apache 文件中的 [Iceberg 結構描述頁](https://iceberg.apache.org/docs/latest/schemas/)。

下表顯示 Athena 資料類型與 Iceberg 資料表資料類型之間的關係。


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/querying-iceberg-supported-data-types.html)

如需有關 Athena 中資料類型的詳細資訊，請參閱[Amazon Athena 中的資料類型](data-types.md)。

# 其他資源
<a name="querying-iceberg-additional-resources"></a>

以下文章位於 AWS 規範性指導文件中。
+ [使用 Amazon Athena SQL 處理 Apache Iceberg 資料表](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html) 

如需有關搭配使用 Athena 與 Apache Iceberg 資料表的深度文章，請參閱 *AWS 大數據部落格*中的下列文章。
+ [搭配使用 Apache Iceberg 與 Amazon DynamoDB 和 Amazon Athena，實作無伺服器 CDC 程序](https://aws.amazon.com/blogs/big-data/implement-a-serverless-cdc-process-with-apache-iceberg-using-amazon-dynamodb-and-amazon-athena/) 
+ [搭配使用 Amazon Athena 與 Apache Iceberg，加速交易資料湖上的資料科學特徵工程](https://aws.amazon.com/blogs/big-data/accelerate-data-science-feature-engineering-on-transactional-data-lakes-using-amazon-athena-with-apache-iceberg/) 
+ [使用 Amazon Athena、Amazon EMR 和 建置 Apache Iceberg 資料湖 AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/) 
+ [使用 Amazon Athena 和 Apache Iceberg 執行資料湖中的 upsert](https://aws.amazon.com/blogs/big-data/perform-upserts-in-a-data-lake-using-amazon-athena-and-apache-iceberg/) 
+ [使用 Apache Iceberg 建置交易資料湖 AWS Glue，並使用 和 Amazon Athena AWS Lake Formation 建立跨帳戶資料共用](https://aws.amazon.com/blogs/big-data/build-a-transactional-data-lake-using-apache-iceberg-aws-glue-and-cross-account-data-shares-using-aws-lake-formation-and-amazon-athena/) 
+ [在資料湖中使用 Apache Iceberg 來支援增量資料處理](https://aws.amazon.com/blogs/big-data/use-apache-iceberg-in-a-data-lake-to-support-incremental-data-processing/) 
+ [建置即時 GDPR 對齊的 Apache Iceberg 資料湖](https://aws.amazon.com/blogs/big-data/build-a-real-time-gdpr-aligned-apache-iceberg-data-lake/) 
+ [使用 Apache Iceberg 和 自動將關聯式來源複寫到交易資料湖 AWS Glue](https://aws.amazon.com/blogs/big-data/automate-replication-of-relational-sources-into-a-transactional-data-lake-with-apache-iceberg-and-aws-glue/) 
+ [使用 Amazon Athena 與 Apache Iceberg 資料表互動，並使用 跨帳戶微調許可 AWS Lake Formation](https://aws.amazon.com/blogs/big-data/interact-with-apache-iceberg-tables-using-amazon-athena-and-cross-account-fine-grained-permissions-using-aws-lake-formation/) 
+ [使用 Apache Iceberg、Amazon EMR Serverless 和 Amazon Athena 建置無伺服器交易資料湖](https://aws.amazon.com/blogs/big-data/build-a-serverless-transactional-data-lake-with-apache-iceberg-amazon-emr-serverless-and-amazon-athena/) 