AWS Athena DROP COLUMN on Iceberg Table Not Reflecting in Glue Catalog

まとめ

  • 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のソースをじっくり読んでみる