當我將 Apache Iceberg 表與 Amazon Athena 一起使用時遇到錯誤。
解決方法
請依照您所遇到的錯誤,按照對應的疑難排解步驟進行操作。
不支援的資料表屬性索引鍵
當 CREATE TABLE 或 ALTER TABLE 陳述式的 TBLPROPERTIES 子句未使用支援的資料表屬性時,就會發生此錯誤。當您建立或修改 Iceberg 表時,Athena 僅允許在資料表屬性中使用預先定義的鍵值組清單。
若要解決此問題,請確認您的 Iceberg 表使用支援的資料表屬性。
Athena 無法產生 CREATE TABLE 陳述式,因為該資料表具有不支援的屬性
當 Athena 無法重現資料表結構時,您會收到「UNSUPPORTED」 錯誤,因為您在查詢中使用了 SHOW CREATE TABLE DDL 陳述式。請改用 DESCRIBE FORMATTED DDL 陳述式來顯示資料表屬性。
您收到「TABLE_REDIRECTION_ERROR」錯誤
當 Athena SELECT 查詢使用不支援的 Iceberg 表中繼資料時,就會發生此錯誤。請確認您的 Athena SELECT 查詢包含支援的查詢 Iceberg 表中繼資料。
您收到「Unsupported Hive type」(不支援的 Hive 類型) 錯誤
當您在 Iceberg 表中使用不支援的資料類型時,就會發生此錯誤。例如,您可能會收到「SHORT, use integer」(SHORT,請使用整數) 錯誤,這是因為 Iceberg 表不支援 Athena 的 tinyint 或 smallint 資料類型。或者,您可能會收到「CHAR, use string」(CHAR,請使用字串) 錯誤,這是因為 Iceberg 表不支援 Athena 的 char 資料類型。
若要解決此問題,請確認您的 Athena 查詢使用的是Iceberg 表支援的資料類型。
您收到「ICEBERG_COMMIT_ERROR」錯誤
當多個語句同時嘗試修改同一組檔案以進行 Iceberg 資料表更新時,就可能會發生此錯誤。例如,當多個 DELETE 陳述式平行處理,嘗試同時刪除同一組記錄。
若要避免此錯誤,請執行下列操作:
- 確認查詢更新按順序執行,以避免平行資料處理。
- 更新 Iceberg 表時,實作具有指數退避的重試機制。
**注意:**Athena 僅支援 AWS Glue 樂觀鎖定。當您使用其他鎖定方法修改 Iceberg 表時,可能會導致資料遺失和中斷交易。如需詳細資訊,請參閱 Apache Iceberg 網站上的樂觀鎖定。
您收到「NOT_SUPPORTED: Iceberg table updates require at least format version 2」(NOT_SUPPORTED:Iceberg 表更新至少需要格式版本 2) 錯誤
當您嘗試對版本 1 Iceberg 表執行 DELETE 作業時,就會發生此錯誤。Athena 僅建立和執行版本 2 Iceberg 表。請確認您的 Iceberg 表使用 Athena 引擎版本 2。如果您使用其他類型的引擎,請將 format-version 表屬性設為 2,以允許資料列層級刪除。例如,當您撰寫 Iceberg 表並將其註冊到 AWS Glue Data Catalog 時,請使用版本 2。如需詳細資訊,請參閱 Apache Iceberg 網站上的刪除格式。
您收到「GENERIC_INTERNAL_ERROR:」錯誤
您收到以下錯誤訊息:
「GENERIC_INTERNAL_ERROR:com.amazonaws.trino.exceptions.UnrecoverableS3OperationException:com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist」(GENERIC_INTERNAL_ERROR:com.amazonaws.trino.exceptions.UnrecoverableS3OperationException:com.amazonaws.services.s3.model.AmazonS3Exception:指定的索引鍵不存在)
當您刪除中繼資料檔案 (例如資訊清單或 metadata.json) 時,就會發生此錯誤。然後 Athena 查詢將失敗。如果無法成功復原檔案,則將資料表復原到快照或時間戳記。
**注意:**您必須在 Apache Spark 環境 (例如 AWS Glue 或 Amazon EMR) 中復原資料表,而不是在 Athena 查詢編輯器中復原。
若要將資料表復原到特定的快照 ID,請執行 roll_to_snapshot Apache Iceberg 命令:
CALL catalog_name.system.rollback_to_snapshot('your-db.your-table', your-snapshot-id)
**注意:**將 your-db、your-table 和 your-snapshot-id 替換為您的值。
若要將資料表復原到特定時間戳記,請執行 rollback_to_timestamp Apache Iceberg 命令:
CALL catalog_name.system.rollback_to_timestamp('your-db.your-table', TIMESTAMP 'yyyy-mm-dd hh:mm:ss')
**注意:**將 your-db、your-table 和 yyyy-mm-dd hh:mm:ss 替換為您的值。
如需詳細資訊,請參閱 Apache Iceberg 網站上的 rollback\to\snapshot 和 rollback\to_timestamp。
相關資訊
對 Athena 中的問題進行疑難排解
如何在 Spark 中使用具有跨帳戶 AWS Glue Data Catalog 的 Apache Iceberg?
查詢 Apache Iceberg 表