Why ALTER TABLE RENAME TO Fails on Hive Tables in AWS Athena

結論

AWS Athena 上で Hive 形式のテーブルに対して ALTER TABLE ... RENAME TO ... は実行できません

これは Iceberg 形式のテーブルにのみ対応しているためです

背景と課題

これまで、Hive 形式の AWS Glue テーブルを運用してきました

このたび、dbt-athena を導入するにあたり、既存テーブルを Iceberg 形式へと移行する計画を立てました

Iceberg 形式に切り替える際、既存テーブルを保持しつつ、できるだけダウンタイムを最小限に抑えたいという要件があり、dbt の --full-refresh オプションでの移行を試みました

発生したエラー

dbt run --full-refresh を実行したところ、Athena 上で以下のエラーが発生しました:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table cannot be renamed 
(Service: AmazonDataCatalog; Status Code: 400; Error Code: InvalidInputException; 
Request ID: 9a22e7cb-2528-4b23-a593-e2bc7218fd50; Proxy: null)

Athena のクエリ実行履歴を見ると、dbt が内部的に以下のようなクエリを発行していることが確認できました:

ALTER TABLE old_table_name RENAME TO new_table_name

つまり、--full-refresh の実行時、新しいテーブルを作成したうえで既存テーブルを RENAME しようとしているようです

なぜ失敗するのか?公式ドキュメントを読む

Athena の公式ドキュメントによると、ALTER TABLE ... RENAME TO は以下のように説明されています:

ALTER TABLE table_name RENAME TO
Supported for Iceberg tables only.

つまり、Hive 形式のテーブルに対しては RENAME クエリはサポートされていないという制限があるのです

結果と対応策

結論として、--full-refresh によるスムーズな移行は断念しました。

代替案としては:

  1. 既存の Hive 形式のテーブルを AWS Glue コンソール上で削除
  2. その後に dbt run を実行して Iceberg 形式のテーブルを作成

という手動手順での移行を選びました

まとめ

Athena 上では Hive 形式のテーブルに ALTER TABLE RENAME TO は使えない

dbt run --full-refresh ではこのクエリが内部的に使用されるため、Hive → Iceberg の移行には注意が必要

スムーズに移行したい場合は、事前にテーブルを削除するなどの工夫が必要