Iceberg Tablesは、SnowflakeでApache Icebergオープンテーブル形式のテーブルを 作成・管理する機能です。データはParquetファイルとしてExternal Volume上の クラウドストレージに格納され、Icebergのメタデータ(マニフェスト・スナップショット)を通じて ACIDトランザクション・スキーマ進化・タイムトラベルが実現されます。 Spark・Trino・Flink等の他エンジンからも同じデータにアクセスできるオープンデータレイクハウスの基盤です。
Iceberg Table
│
├─ Catalog(メタデータ管理)
│ ├─ Snowflake Catalog(Snowflakeが管理)
│ └─ External Catalog(AWS Glue, Hive Metastore等)
│
├─ Metadata Layer
│ ├─ metadata file (JSON) ← テーブルスキーマ、パーティション仕様
│ ├─ manifest list ← スナップショットごとのマニフェスト一覧
│ └─ manifest file ← データファイルの一覧と統計情報
│
└─ Data Layer
└─ Parquet files ← 実際のデータ(列指向圧縮)Snowflakeがメタデータとデータの両方を管理する形式です。 INSERT/UPDATE/DELETE/MERGEの全DML操作が可能で、 通常のSnowflakeテーブルとほぼ同じ操作感で利用できます。
-- 前提: External Volumeが作成済み
-- (CREATE EXTERNAL VOLUMEの詳細はExternal Volumesの記事を参照)
-- Snowflakeカタログ管理のIceberg Table作成
CREATE OR REPLACE ICEBERG TABLE analytics.lakehouse.web_events (
event_id STRING NOT NULL,
user_id INT,
event_type STRING,
page_url STRING,
event_timestamp TIMESTAMP_NTZ,
properties OBJECT,
session_id STRING
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_s3_vol'
BASE_LOCATION = 'analytics/web_events/';
-- DML操作が可能
INSERT INTO analytics.lakehouse.web_events
VALUES (
'evt-001', 12345, 'page_view', '/products/123',
'2026-03-27 14:30:00',
OBJECT_CONSTRUCT('referrer', 'google.com', 'device', 'mobile'),
'sess-abc'
);
-- UPDATE
UPDATE analytics.lakehouse.web_events
SET properties = OBJECT_INSERT(properties, 'processed', TRUE)
WHERE event_id = 'evt-001';
-- DELETE
DELETE FROM analytics.lakehouse.web_events
WHERE event_timestamp < DATEADD(YEAR, -2, CURRENT_TIMESTAMP());-- AWS Glue Data Catalogとの連携
-- Step 1: Catalog Integrationの作成
CREATE OR REPLACE CATALOG INTEGRATION glue_catalog_int
CATALOG_SOURCE = GLUE
CATALOG_NAMESPACE = 'analytics_db'
TABLE_FORMAT = ICEBERG
GLUE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-glue-role'
GLUE_CATALOG_ID = '123456789012'
GLUE_REGION = 'us-east-1'
ENABLED = TRUE;
-- Step 2: 外部カタログ管理のIceberg Table作成(読み取り専用)
CREATE OR REPLACE ICEBERG TABLE analytics.lakehouse.spark_events
EXTERNAL_VOLUME = 'iceberg_s3_vol'
CATALOG = 'glue_catalog_int'
CATALOG_TABLE_NAME = 'web_events';
-- 読み取りクエリは通常通り実行可能
SELECT event_type, COUNT(*) AS cnt
FROM analytics.lakehouse.spark_events
WHERE event_timestamp >= '2026-03-01'
GROUP BY event_type
ORDER BY cnt DESC;
-- メタデータのリフレッシュ(外部で更新された場合)
ALTER ICEBERG TABLE analytics.lakehouse.spark_events REFRESH;| 観点 | Snowflakeカタログ | 外部カタログ(Glue/Hive) |
|---|---|---|
| メタデータ管理者 | Snowflake | 外部サービス |
| DML操作 | INSERT / UPDATE / DELETE / MERGE 可能 | 読み取り専用(SELECT のみ) |
| Clustering Keys | 設定可能 | 設定不可 |
| 他エンジンからのアクセス | Open Catalog (Polaris) 経由 | 同一カタログを共有 |
| メタデータ更新 | DML実行時に自動 | ALTER ICEBERG TABLE ... REFRESHで手動同期 |
| 主な用途 | Snowflake主体のレイクハウス | Spark/Snowflakeの相互運用 |
-- 列の追加(Snowflakeカタログの場合)
ALTER ICEBERG TABLE analytics.lakehouse.web_events
ADD COLUMN country_code STRING;
-- 列名の変更
ALTER ICEBERG TABLE analytics.lakehouse.web_events
RENAME COLUMN page_url TO url;
-- 列の削除
ALTER ICEBERG TABLE analytics.lakehouse.web_events
DROP COLUMN session_id;Icebergのスキーマ進化は後方互換性を維持します。 列の追加後も、追加前のスナップショットのデータは新列がNULLとして読み取られます。 列のリネームは内部的にフィールドIDで管理されるため、 既存のParquetファイルの書き換えは発生しません。
-- 特定時点のデータを照会
SELECT * FROM analytics.lakehouse.web_events
AT (TIMESTAMP => '2026-03-26 00:00:00'::TIMESTAMP_NTZ);
-- スナップショット一覧の確認
SELECT *
FROM TABLE(INFORMATION_SCHEMA.ICEBERG_TABLE_SNAPSHOTS(
TABLE_NAME => 'analytics.lakehouse.web_events'
));| 観点 | 通常テーブル | Iceberg Table (Snowflakeカタログ) |
|---|---|---|
| データ形式 | Snowflake独自のFDN形式 | Apache Parquet(オープン形式) |
| データの格納先 | Snowflakeマネージドストレージ | External Volume(ユーザー所有のクラウドストレージ) |
| 他エンジンからのアクセス | 不可(Snowflake経由のみ) | Spark / Trino / Flink等から直接アクセス可能 |
| DML性能 | 最適化されている | 通常テーブルより若干のオーバーヘッド |
| ストレージコスト | Snowflakeストレージ料金 | クラウドストレージ料金(S3/GCS/Azure Blob) |
| ベンダーロックイン | あり | なし(オープンフォーマット) |
-- CTAS(CREATE TABLE AS SELECT)で変換
CREATE OR REPLACE ICEBERG TABLE analytics.lakehouse.web_events_iceberg
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_s3_vol'
BASE_LOCATION = 'analytics/web_events_iceberg/'
AS
SELECT * FROM analytics.standard.web_events;Data Sharing & Interoperability
問題 1
SparkがAWS Glue Data Catalogで管理しているIcebergテーブルのデータを、Snowflakeから読み取りたい。Snowflake側でCREATE ICEBERG TABLEを実行する際に必要な設定として正しいものはどれか。
正解: B
外部カタログ(AWS Glue)管理のIceberg TableをSnowflakeで読み取るには、(1) CREATE CATALOG INTEGRATIONでGlueへの接続設定を作成、(2) CREATE ICEBERG TABLEでEXTERNAL_VOLUME、CATALOG(Integration名)、CATALOG_TABLE_NAME を指定します。CATALOG = 'SNOWFLAKE'はSnowflake管理カタログであり、外部カタログの参照にはCatalog Integration経由のアクセスが必要です。CATALOG = 'GLUE'のような直接指定はサポートされていません。
Iceberg TableとExternal Tableの違いは何ですか?
External Tableはクラウドストレージ上のファイルを読み取り専用で照会するテーブルで、CSV/JSON/Parquet等の任意の形式をサポートしますが、DML操作は一切できません。一方Iceberg Tableは Apache Iceberg形式(Parquet + メタデータ)を使い、Snowflakeカタログの場合はINSERT/UPDATE/DELETE/MERGEが可能です。Iceberg TableはACIDトランザクション、スキーマ進化、タイムトラベル、パーティション進化などのテーブル管理機能を提供します。
Iceberg Tableのデータを他のエンジン(Spark, Trino等)から直接読めますか?
はい、Iceberg Tableのデータは標準的なApache Iceberg形式(Parquetデータファイル + Icebergメタデータ)でExternal Volume上に格納されるため、Spark/Trino/Flink等のIceberg対応エンジンから直接読み取り可能です。Snowflakeカタログの場合はSnowflakeのOpen Catalog(Polaris)経由でメタデータを公開でき、外部カタログ(AWS Glue等)の場合はカタログを共有することで相互アクセスが可能です。
Iceberg TableにClustering Keysは設定できますか?
Snowflakeカタログ管理のIceberg Tableでは、Clustering Keysを設定してAutomatic Clusteringを有効化できます。ただし外部カタログ管理のIceberg Tableは読み取り専用のため、Clustering Keysの設定はできません。通常のSnowflakeテーブルと同様に、Clustering Keysは大規模テーブルのクエリパフォーマンスを最適化するために使用します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...