Amazon Athena で Apache Iceberg テーブルを使用しましたが、エラーメッセージが表示されました。
解決策
表示されたエラーメッセージのトラブルシューティングの手順を実行します。
テーブルプロパティキーがサポートされていません
このエラーは、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントの TBLPROPERTIES 句が、サポートされているテーブルプロパティを使用していない場合に発生します。Athena では、テーブルプロパティで事前定義されたキーと値のペアのみが Iceberg テーブルを作成または変更できます。
このエラーを解決するには、Iceberg テーブルがサポートされているテーブルプロパティを使用している必要があります。
テーブルにサポートされていないプロパティがあるため、CREATE TABLE ステートメントの生成に失敗しました
このエラーは、DDL ステートメント SHOW CREATE TABLE を Iceberg テーブルで使用しているクエリで、Athena がテーブル構造を再現できない場合に発生します。テーブルのプロパティを表示するには、DDL ステートメントには SHOW CREATE TABLE ではなく、DESCRIBE FORMATTED を使用します。
TABLE_REDIRECTION_ERROR
このエラーは、Athena の SELECT クエリで、サポートされていない Iceberg テーブルのメタデータを使用すると発生します。Athena の SELECT クエリに、サポートされている Iceberg テーブルメタデータが含まれていることを確認してください。
NOT_SUPPORTED: 型が Iceberg でサポートされていません
このエラーは、サポートされていないデータ型を Iceberg テーブルで使用すると発生します。たとえば、Athena のデータ型である tinyint、smallint、char は Iceberg テーブルではサポートされていません。Athena クエリが Iceberg テーブルでサポートされているデータ型を使用していることを確認してください。
ICEBERG_COMMIT_ERROR
このエラーは、複数のステートメントが Iceberg テーブル更新で並行して実行される同じファイルセットを変更しようとした場合に発生する可能性があります。たとえば、複数の DELETE ステートメントを並行して実行し、同じレコードセットを同時に削除しようとした場合にこのエラーが発生します。
この問題を解決するには、次の手順を実行します。
- 並列データ処理を避けるために、クエリの更新は順番に実行する必要があります。
- Iceberg テーブルを更新するときに、エクスポネンシャルバックオフによる再試行メカニズムを実装します。
注: Athena は AWS Glue の楽観的ロックのみをサポートしています。Iceberg テーブルを他のロック方法で変更すると、データが失われ、トランザクションが中断する可能性があります。
詳細については、Apache Iceberg のウェブサイトで「楽観的ロック」を参照してください。
GENERIC_INTERNAL_ERROR: v1 テーブルに削除ファイルを書き込めません
このエラーは、Iceberg v1 テーブルで DELETE 操作を実行しようとしたときに発生します。Athena は、Iceberg v2 テーブルのみを作成し、そのテーブルでのみ動作します。
Iceberg テーブルが Athena エンジンバージョン 2 を使用していることを確認してください。別のタイプのエンジンを使用する場合は、テーブルプロパティ format-version が 2 に設定されており、行レベルの削除が許可されていることを確認してください。たとえば、Iceberg テーブルを作成して AWS Glue データカタログに登録する場合は、バージョン 2 を使用します。
詳細については、Apache Iceberg のウェブサイトで「フォーマットの削除」を参照してください。
GENERIC_INTERNAL_ERROR: com.facebook.presto.spi.PrestoException: 指定されたキーは存在しません
このエラーは、マニフェストリストや metadata.json などのメタデータファイルを削除する際に発生します。その後、Athena クエリは失敗します。ファイルを正常に回復できない場合は、テーブルをスナップショットまたはタイムスタンプにロールバックします。
注: Athena クエリエディターではなく、AWS Glue や Amazon EMR などの Spark 環境でテーブルをロールバックする必要があります。
テーブルを特定のスナップショット ID にロールバックするには、Apache Iceberg コマンド roll_to_snapshot を実行します。
CALL catalog_name.system.rollback_to_snapshot('your-db.your-table', your-snapshot-id)
注: your-db、your-table、your-snapshot-id は、実際の変数に置き換えてください。
テーブルを特定のタイムスタンプにロールバックするには、Apache Iceberg コマンド rollback_to_timestamp を実行します。
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 は、実際の変数に置き換えてください。
詳細については、Apace Iceberg のウェブサイトで rollback_to_snapshot および rollback_to_timestamp を参照してください。
関連情報
Athena での問題のトラブルシューティング
Apache Iceberg を Spark のクロスアカウント AWS Glue データカタログで使用する方法を教えてください
Apache Iceberg テーブルをクエリする