DuckDB で Glue Data Catalog に Iceberg on S3 テーブルを作成する

icebergaws

DuckDB 1.5 から location を指定することで S3 Tables でない通常の S3 上にも Iceberg テーブルを作成できるようになった。

EMR Serverless から S3 Tables に Iceberg テーブルを作成しデータを書き込んで Athena からクエリする - sambaiz.net

LOAD aws;
LOAD httpfs;
LOAD iceberg;

CREATE SECRET s3_secret (
    TYPE s3,
    PROVIDER credential_chain,
    CHAIN 'config',
    PROFILE 'your-profile'
);

ATTACH '123456789012' AS glue_catalog (
    TYPE iceberg,
    ENDPOINT_TYPE glue,
    SECRET s3_secret
);

CREATE TABLE glue_catalog.default.iceberg_test (
    id INTEGER,
    name VARCHAR,
    created_at TIMESTAMP
) WITH (
    'format-version' = '2',
    'location' = 's3://your-bucket/iceberg-test/'
);

SELECT, INSERT, UPDATE, DELETE は従来通り動作する。

INSERT INTO glue_catalog.default.iceberg_test VALUES
    (1, 'Alice', '2026-03-17 22:00:00'),
    (2, 'Bob', '2026-03-17 22:01:00'),
    (3, 'Charlie', '2026-03-17 22:02:00');

UPDATE glue_catalog.default.iceberg_test SET name = 'Alice Updated' WHERE id = 1;

DELETE FROM glue_catalog.default.iceberg_test WHERE id = 3;

SELECT * FROM glue_catalog.default.iceberg_test;

ちなみに 10 万行のテーブルに対する SELECT SUM(value) を EXPLAIN ANALYZE したところ、Total Time 576ms のうち、単一の Parquet ファイルを読み込む ICEBERG_SCAN にかかる時間は 180ms 程度だった。 続いて SELECT AVG(value) を実行したところ External File Cache によりファイルがキャッシュされ #GET: 1、Total Time 128ms に短縮されたので、その多くはインターネット通信によるものだと思われる。

┌─────────────────────────────────────┐
│┌───────────────────────────────────┐│
││         HTTPFS HTTP Stats         ││
││            in: 1.3 MiB            ││
││              #GET: 5              ││
│└───────────────────────────────────┘│
└─────────────────────────────────────┘
┌────────────────────────────────────────────────┐
│┌──────────────────────────────────────────────┐│
││              Total Time: 0.576s              ││
│└──────────────────────────────────────────────┘│
└────────────────────────────────────────────────┘
┌───────────────────────────┐
│    UNGROUPED_AGGREGATE    │
│           1 row           │
│           0.00s           │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         PROJECTION        │
│        100,000 rows       │
│           0.00s           │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         TABLE_SCAN        │
│         Function:         │
│        ICEBERG_SCAN       │
│     Projections: value    │
│    Total Files Read: 1    │
│        100,000 rows       │
│           0.18s           │
└───────────────────────────┘