Snowflake

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

2026-03-26
更新: 2026-03-27
NicheeLab編集部
目次
  1. Apache Icebergの基本構造
  2. Snowflakeカタログ管理のIceberg Table
  3. 外部カタログ管理のIceberg Table
  4. カタログ管理方式の詳細比較
  5. スキーマ進化
  6. タイムトラベル
  7. 通常テーブル vs Iceberg Table
  8. 通常テーブルからIceberg Tableへの変換
  9. ベストプラクティス
  10. 問題で確認
  11. よくある質問

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

クラウドの基礎から読む

資格の話をしない、クラウドそのものの入門 8 章があります。登録なしで全部読めます。

第 0 部・無料

クラウド自体がはじめての方へ

サーバー・ネットワーク・データベースの前提知識なしで読める 8 章。登録不要・無料。

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

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

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

NicheeLab編集部

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


関連記事
Snowflake

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

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

Snowflake

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

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

Snowflake

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

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

Snowflake

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

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

Snowflake

SnowPro Platform Associate(SOL-C01)完全解説|現在は予約不可・試験内容と次の受験先

SnowPro Associate: Platform(SOL-C01)は2026年10月時点でSnowflakeの公式...

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