Snowflake

Snowflake Iceberg Tables Complete Guide: Building and Operating Open Table Format

2026-03-26
更新: 2026-03-27
NicheeLab Editorial Team

Iceberg Tables let you create and manage tables in the Apache Iceberg open table format on Snowflake. The data is stored as Parquet files in cloud storage on an External Volume, and the Iceberg metadata (manifests and snapshots) delivers ACID transactions, schema evolution, and time travel. Other engines such as Spark, Trino, and Flink can also read the same data, making this the foundation of an open data lakehouse.

Apache Iceberg Architecture Overview

Iceberg Table
  │
  ├─ Catalog (metadata management)
  │    ├─ Snowflake Catalog (managed by Snowflake)
  │    └─ External Catalog (AWS Glue, Hive Metastore, etc.)
  │
  ├─ Metadata Layer
  │    ├─ metadata file (JSON) ← table schema, partition spec
  │    ├─ manifest list        ← list of manifests per snapshot
  │    └─ manifest file        ← list of data files and statistics
  │
  └─ Data Layer
       └─ Parquet files        ← the actual data (columnar, compressed)

Snowflake-Catalog Iceberg Tables

Snowflake manages both metadata and data. All DML operations (INSERT/UPDATE/DELETE/MERGE) are supported, so the experience is nearly identical to a regular Snowflake table.

-- Prerequisite: an External Volume must already exist
-- (See the External Volumes article for CREATE EXTERNAL VOLUME details)

-- Create a Snowflake-catalog 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 is supported
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());

External-Catalog Iceberg Tables

-- Integration with AWS Glue Data Catalog

-- Step 1: Create the 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: Create the external-catalog Iceberg Table (read-only)
CREATE OR REPLACE ICEBERG TABLE analytics.lakehouse.spark_events
  EXTERNAL_VOLUME = 'iceberg_s3_vol'
  CATALOG = 'glue_catalog_int'
  CATALOG_TABLE_NAME = 'web_events';

-- Read queries run normally
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;

-- Refresh metadata (when updated externally)
ALTER ICEBERG TABLE analytics.lakehouse.spark_events REFRESH;

Catalog Management: Detailed Comparison

AspectSnowflake CatalogExternal Catalog (Glue / Hive)
Metadata ownerSnowflakeExternal service
DML operationsINSERT / UPDATE / DELETE / MERGE supportedRead-only (SELECT only)
Clustering KeysSupportedNot supported
Access from other enginesVia Open Catalog (Polaris)Share the same catalog
Metadata refreshAutomatic on DML executionManual sync with ALTER ICEBERG TABLE ... REFRESH
Primary use caseSnowflake-centric lakehouseSpark / Snowflake interoperability

Schema Evolution

-- Add a column (Snowflake catalog)
ALTER ICEBERG TABLE analytics.lakehouse.web_events
  ADD COLUMN country_code STRING;

-- Rename a column
ALTER ICEBERG TABLE analytics.lakehouse.web_events
  RENAME COLUMN page_url TO url;

-- Drop a column
ALTER ICEBERG TABLE analytics.lakehouse.web_events
  DROP COLUMN session_id;

Iceberg schema evolution preserves backward compatibility. After adding a column, data from pre-add snapshots is read with the new column as NULL. Column renames are tracked internally by field ID, so existing Parquet files are never rewritten.

Time Travel

-- Query data at a specific point in time
SELECT * FROM analytics.lakehouse.web_events
AT (TIMESTAMP => '2026-03-26 00:00:00'::TIMESTAMP_NTZ);

-- List snapshots
SELECT *
FROM TABLE(INFORMATION_SCHEMA.ICEBERG_TABLE_SNAPSHOTS(
  TABLE_NAME => 'analytics.lakehouse.web_events'
));

Standard Table vs Iceberg Table

AspectStandard TableIceberg Table (Snowflake catalog)
Data formatSnowflake-proprietary FDN formatApache Parquet (open format)
Data storage locationSnowflake-managed storageExternal Volume (customer-owned cloud storage)
Access from other enginesNot supported (Snowflake only)Direct access from Spark, Trino, Flink, etc.
DML performanceHighly optimizedSlight overhead compared with standard tables
Storage costSnowflake storage pricingCloud storage pricing (S3 / GCS / Azure Blob)
Vendor lock-inYesNo (open format)

Converting a Standard Table to an Iceberg Table

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

Best Practices

  • Use a standard table if you do not need multi-engine access: for Snowflake-only workloads, standard tables deliver better DML performance and simpler management.
  • Prefer the Snowflake catalog as the default: choose the Snowflake catalog when you need DML, and reach for an external catalog only when integrating with an existing Spark pipeline.
  • REFRESH regularly when using an external catalog: changes made externally (e.g. by Spark) are not visible in Snowflake until REFRESH is executed.
  • Use BASE_LOCATION to keep paths logically separated: assign a distinct BASE_LOCATION per table to keep cloud storage organized.
  • Manage snapshots regularly: accumulating old snapshots bloats metadata, so define and enforce a retention policy.

Check Your Understanding

Data Sharing & Interoperability

問題 1

You want to read, from Snowflake, an Iceberg table whose metadata Spark manages in AWS Glue Data Catalog. Which configuration is correct when running CREATE ICEBERG TABLE in Snowflake?

  1. Specify CATALOG = 'SNOWFLAKE' and set BASE_LOCATION to Spark's data path
  2. Specify EXTERNAL_VOLUME and CATALOG (the Catalog Integration name), and set CATALOG_TABLE_NAME to the table name in Glue
  3. Create a Storage Integration, reference it as an External Stage, and create an External Table
  4. Specify 'GLUE' directly in the CATALOG parameter, and set GLUE_CATALOG_ID and GLUE_REGION at table creation time

正解: B

To read an Iceberg Table managed by an external catalog (AWS Glue) from Snowflake, you (1) create a Catalog Integration with CREATE CATALOG INTEGRATION to configure the connection to Glue, then (2) specify EXTERNAL_VOLUME, CATALOG (the Integration name), and CATALOG_TABLE_NAME in CREATE ICEBERG TABLE. CATALOG = 'SNOWFLAKE' is for the Snowflake-managed catalog; referencing an external catalog must go through a Catalog Integration. Directly specifying CATALOG = 'GLUE' is not supported.

Frequently Asked Questions

What is the difference between an Iceberg Table and an External Table?

An External Table is a read-only table that queries files in cloud storage. It supports arbitrary formats like CSV, JSON, and Parquet, but allows no DML at all. An Iceberg Table, in contrast, uses the Apache Iceberg format (Parquet plus metadata), and with the Snowflake catalog you can run INSERT/UPDATE/DELETE/MERGE. Iceberg Tables also provide table-management features such as ACID transactions, schema evolution, time travel, and partition evolution.

Can other engines (Spark, Trino, etc.) read Iceberg Table data directly?

Yes. Iceberg Table data is stored on an External Volume in the standard Apache Iceberg format (Parquet data files plus Iceberg metadata), so any Iceberg-compatible engine such as Spark, Trino, or Flink can read it directly. With the Snowflake catalog you can publish the metadata through Snowflake's Open Catalog (Polaris). With an external catalog like AWS Glue, sharing the same catalog enables mutual access.

Can you set Clustering Keys on an Iceberg Table?

On Snowflake-catalog Iceberg Tables you can set Clustering Keys and enable Automatic Clustering. External-catalog Iceberg Tables are read-only, however, so Clustering Keys cannot be configured. As with regular Snowflake tables, Clustering Keys are used to optimize query performance on large tables.

Check what you learned with practice questions

Practice with certification-focused question sets

無料で問題を解いてみる
Author

NicheeLab Editorial Team

NicheeLab editorial team focused on data engineering and cloud certification learning. Content is structured around practical study needs and official exam domains.


Related articles
Snowflake

Snowflake Certifications: All 11 Exams Explained (2026)

Every SnowPro certification — Associate, Core, Specialty, Ad...

Snowflake

Snowflake Exam Difficulty Ranking: All 11 Certs Compared (2026)

All 11 SnowPro exams ranked by difficulty with study-time es...

Snowflake

Snowflake Study Guide: Fastest Pass Route by Exam (2026)

How to pass SnowPro certifications efficiently — official ma...

Snowflake

SnowPro Core (COF-C03): Complete Exam Guide (2026)

Pass the SnowPro Core exam — six domains, scope, sample ques...

Snowflake

SnowPro Associate Platform (SOL-C01): Complete Guide (2026)

The entry-level SnowPro Associate exam — scope, weighting, s...

Browse all Snowflake articles (103)
© 2026 NicheeLab All rights reserved.