Upgrade to Pro — share decks privately, control downloads, hide ads and more …

最低限のSQLしか書けない私が Apache Icebergを触ってみた結果 〜S3なのにU...

Avatar for inori inori
July 17, 2026
150

最低限のSQLしか書けない私が Apache Icebergを触ってみた結果 〜S3なのにUPDATE・Time Travelできた話〜

2026年7月18日開催
BigData-JAWS #34 Apache Iceberg LT大会 初心者から有識者に 登壇資料
https://jawsug-bigdata.connpass.com/event/394145/

Avatar for inori

inori

July 17, 2026

More Decks by inori

Transcript

  1. Agenda はじめに 01 01 Apache Icebergとは? 02 02 実践 03

    03 ハマりポイント 04 04 まとめ 05 05
  2. S3バケットは以下のように作成   バケット名:   apache-iceberg-demo-2026 Athena設定は以下   Location of query

    result:   s3://apache-iceberg-demo-2026/athena-results/ 実践編 ∼S3バケット作成・Athena設定∼ S3バケット内を ディレクトリで整理する為
  3. DB作成 Icebergテーブル作成 create DATABASE my_iceberg_db; 実践編 ∼DB作成・Icebergテーブル作成∼ CREATE TABLE my_iceberg_db.users (

    id BIGINT, name STRING, score BIGINT ) LOCATION 's3://apache-iceberg-demo-2026/iceberg/users/' TBLPROPERTIES ('table_type' = 'ICEBERG');
  4. DB作成 Icebergテーブル作成 create DATABASE my_iceberg_db; CREATE TABLE my_iceberg_db.users ( id

    BIGINT, name STRING, score BIGINT ) LOCATION 's3://apache-iceberg-demo-2026/iceberg/users/' TBLPROPERTIES ('table_type' = 'ICEBERG'); 実践編 ∼DB作成・Icebergテーブル作成∼ my_iceberg_db.users →userテーブル作成 id /name /score →カラムの定義 LOCATION →S3内のデータの保存場所 TBLPROPERTIES ('table_type' = 'ICEBERG'); →「これは Icebergテーブルだよ」という宣⾔ コレがないとIcebergにならない!!!
  5. usersテーブルへ3人分のデータをINSERT INSERTしたデータの確認(SELECT) 実践編 ∼INSERT・SELECT∼ INSERT INTO my_iceberg_db.users VALUES (1, 'Alice', 100),

    (2, 'Bob', 200), (3, 'Charlie', 300); この時点でスナップショットが作成される SELECT * FROM my_iceberg_db.users;
  6. usersテーブルへ3人分のデータをINSERT INSERTしたデータの確認(SELECT) 実践編 ∼INSERT・SELECT∼ INSERT INTO my_iceberg_db.users VALUES (1, 'Alice', 100),

    (2, 'Bob', 200), (3, 'Charlie', 300); この時点でスナップショットが作成される SELECT * FROM my_iceberg_db.users;
  7. usersテーブルへ3人分のデータをINSERT INSERTしたデータの確認(SELECT) 実践編 ∼INSERT①・SELECT∼ INSERT INTO my_iceberg_db.users VALUES (1, 'Alice', 100),

    (2, 'Bob', 200), (3, 'Charlie', 300); この時点でスナップショットが作成される SELECT * FROM my_iceberg_db.users; INSERTした3行が表⺬されている!
  8. INSERT INTO my_iceberg_db.users VALUES (4, 'Dave', 999); 実践編 ∼スナップショット確認∼ スナップショットを確認するSELECT文を実⾏ SELECT

    * FROM "my_iceberg_db"."users$snapshots" ORDER BY committed_at; スナップショットが2つ存在している事を確認! 今回は1を使います
  9. INSERT INTO my_iceberg_db.users VALUES (4, 'Dave', 999); 実践編 ∼Time Travel∼ 先ほど確認したDaveを追加する前の時刻を入れてSELECT

    さっき追加したDaveがいない!!!!!! SELECT * FROM my_iceberg_db.users FOR TIMESTAMP AS OF TIMESTAMP '2026-07-17 15:30:22.160';
  10. emailカラムを追加 確認 INSERT INTO my_iceberg_db.users VALUES (4, 'Dave', 999); INSERT

    INTO my_iceberg_db.users VALUES (4, 'Dave', 999); 実践編 ∼スキーマ進化(カラム追加)∼ ALTER TABLE my_iceberg_db.users ADD COLUMNS (email STRING); SELECT * FROM my_iceberg_db.users;
  11. emailカラムを追加 確認 INSERT INTO my_iceberg_db.users VALUES (4, 'Dave', 999); INSERT

    INTO my_iceberg_db.users VALUES (4, 'Dave', 999); 実践編 ∼スキーマ進化(カラム追加)∼ ALTER TABLE my_iceberg_db.users ADD COLUMNS (email STRING); SELECT * FROM my_iceberg_db.users;
  12. emailカラムを追加 確認 INSERT INTO my_iceberg_db.users VALUES (4, 'Dave', 999); INSERT

    INTO my_iceberg_db.users VALUES (4, 'Dave', 999); 実践編 ∼スキーマ進化(カラム追加)∼ emailカラムが存在している!! ALTER TABLE my_iceberg_db.users ADD COLUMNS (email STRING); SELECT * FROM my_iceberg_db.users;