Snowflake

Snowflake Iceberg Tables完全ガイド|オープンテーブル形式の構築と運用

2026-03-26
更新: 2026-03-27
NicheeLab編集部

Iceberg Tablesは、SnowflakeでApache Icebergオープンテーブル形式のテーブルを 作成・管理する機能です。データはParquetファイルとしてExternal Volume上の クラウドストレージに格納され、Icebergのメタデータ(マニフェスト・スナップショット)を通じて ACIDトランザクション・スキーマ進化・タイムトラベルが実現されます。 Spark・Trino・Flink等の他エンジンからも同じデータにアクセスできるオープンデータレイクハウスの基盤です。

Apache Icebergの基本構造

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カタログ管理のIceberg Table

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());

外部カタログ管理のIceberg Table

-- 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'
));

通常テーブル vs Iceberg Table

観点通常テーブルIceberg Table (Snowflakeカタログ)
データ形式Snowflake独自のFDN形式Apache Parquet(オープン形式)
データの格納先SnowflakeマネージドストレージExternal Volume(ユーザー所有のクラウドストレージ)
他エンジンからのアクセス不可(Snowflake経由のみ)Spark / Trino / Flink等から直接アクセス可能
DML性能最適化されている通常テーブルより若干のオーバーヘッド
ストレージコストSnowflakeストレージ料金クラウドストレージ料金(S3/GCS/Azure Blob)
ベンダーロックインありなし(オープンフォーマット)

通常テーブルからIceberg Tableへの変換

-- 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;

ベストプラクティス

  • マルチエンジンアクセスが不要ならば通常テーブルを使う:Snowflakeのみで利用する場合は通常テーブルの方がDML性能が高く、管理もシンプル
  • Snowflakeカタログを第一選択にする:DML操作が必要な場合はSnowflakeカタログを使い、外部カタログは既存Sparkパイプラインとの統合時に選択する
  • 外部カタログ利用時は定期的にREFRESH:Sparkなどが外部で更新した変更はREFRESHを実行しないとSnowflake側に反映されない
  • BASE_LOCATIONで論理的にパス分離:テーブルごとに異なるBASE_LOCATIONを指定し、クラウドストレージ上のデータを整理する
  • スナップショットの定期的な管理:古いスナップショットが蓄積するとメタデータが肥大化するため、データ保持ポリシーを設定する

問題で確認

Data Sharing & Interoperability

問題 1

SparkがAWS Glue Data Catalogで管理しているIcebergテーブルのデータを、Snowflakeから読み取りたい。Snowflake側でCREATE ICEBERG TABLEを実行する際に必要な設定として正しいものはどれか。

  1. CATALOG = 'SNOWFLAKE'を指定し、BASE_LOCATIONにSparkのデータパスを設定する
  2. EXTERNAL_VOLUMEとCATALOG(Catalog Integration名)を指定し、CATALOG_TABLE_NAMEでGlue上のテーブル名を指定する
  3. Storage Integrationを作成してExternal Stageとして参照し、External Tableを作成する
  4. CATALOGパラメータに'GLUE'を直接指定し、GLUE_CATALOG_IDとGLUE_REGIONをテーブル作成時に設定する

正解: 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は大規模テーブルのクエリパフォーマンスを最適化するために使用します。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.