まとめ
- Iceberg形式でGlue Tableを作成し、カラムをdropしたもののGlue Catalogに反映されなかった
- 雰囲気的にTrinoのバグのよう
- Add Column実施時は問題なくGlue Catalogと連動している
実施したこと
Athenaからiceberg table作成
CREATE TABLE “iceberg_db.”sample_table”
WITH (
table_type = 'iceberg',
location = 's3://iceberg-test-output/iceberg_db/sample_table/‘,
is_external = false
)
AS (
SELECT …. FROM ….
)
Glue Catalogから確認すると4カラムある状態
今回はcreate_timeカラムをdropして検証する

DROP COLUMN実行
ALTER TABLE iceberg_db.sample_table DROP COLUMN create_time;
Glue Catalogからカラムを確認すると、まだcreate_timeカラム存在している(さっきと同じ状態)

ちなみにAthenaからinformation_schemaをselectすると、カラムは正しくdropされたことになっている
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'iceberg_db'
AND table_name = 'sample_table';
どうやらうまくglue catalogが連動していないみたい
Glue Catalogが参照しているicebergのmetadataを覗いてみる
Glue Catalogに「参照しているmetadataはどれか」の設定があるので直接jsonを覗いてみる

ファイルの中身を抜粋
...
"current-schema-id": 1,
"schemas": [
{
"type": "struct",
"schema-id": 0,
"fields": [
{
"id": 1,
"name": "id",
"required": false,
"type": "int"
},
{
"id": 2,
"name": "name",
"required": false,
"type": "string"
},
{
"id": 3,
"name": "create_time",
"required": false,
"type": "timestamp"
},
{
"id": 4,
"name": "_extract_ts",
"required": false,
"type": "timestamp"
}
]
},
{
"type": "struct",
"schema-id": 1,
"fields": [
{
"id": 1,
"name": "id",
"required": false,
"type": "int"
},
{
"id": 2,
"name": "name",
"required": false,
"type": "string"
},
{
"id": 4,
"name": "_extract_ts",
"required": false,
"type": "timestamp"
}
]
},
{
"type": "struct",
"schema-id": 2,
"fields": [
{
"id": 1,
"name": "id",
"required": false,
"type": "int"
},
{
"id": 2,
"name": "name",
"required": false,
"type": "string"
},
{
"id": 4,
"name": "_extract_ts",
"required": false,
"type": "timestamp"
},
{
"id": 5,
"name": "create_time",
"required": false,
"type": "timestamp"
}
]
}
],
...
おそらく"schema-id": 2,
が一番最新のスキーマ(カラム一覧)の状態を表していて、このスキーマの内容が間違っている(DROP COLUMN実行前のカラム一覧が最新の状態として定義されている)
内部処理の動きを想像するとこんな感じ
1. athena drop column実行
2. 新しいmetadata jsonを作成
3. s3にjsonをupload
4. glue catalogのmetadata参照先をuploadされたpathに変更
今回の事象ではjsonの内容がおかしいので「2. 新しいmetadata jsonを作成」での不具合なのかも…
補足
詳しくは追えてないけどこのあたりのバグを疑い中
trino/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/GlueIcebergTableOperations.java at master · trinodb/trino
trino/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/HiveMetastoreTableOperations.java at master · trinodb/trino
まとめ
時間があればTrinoのソースをじっくり読んでみる