結論
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
によるスムーズな移行は断念しました。
代替案としては:
- 既存の Hive 形式のテーブルを AWS Glue コンソール上で削除
- その後に
dbt run
を実行して Iceberg 形式のテーブルを作成
という手動手順での移行を選びました
まとめ
Athena 上では Hive 形式のテーブルに ALTER TABLE RENAME TO
は使えない
dbt run --full-refresh
ではこのクエリが内部的に使用されるため、Hive → Iceberg の移行には注意が必要
スムーズに移行したい場合は、事前にテーブルを削除するなどの工夫が必要