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.
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 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());-- 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;| Aspect | Snowflake Catalog | External Catalog (Glue / Hive) |
|---|---|---|
| Metadata owner | Snowflake | External service |
| DML operations | INSERT / UPDATE / DELETE / MERGE supported | Read-only (SELECT only) |
| Clustering Keys | Supported | Not supported |
| Access from other engines | Via Open Catalog (Polaris) | Share the same catalog |
| Metadata refresh | Automatic on DML execution | Manual sync with ALTER ICEBERG TABLE ... REFRESH |
| Primary use case | Snowflake-centric lakehouse | Spark / Snowflake interoperability |
-- 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.
-- 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'
));| Aspect | Standard Table | Iceberg Table (Snowflake catalog) |
|---|---|---|
| Data format | Snowflake-proprietary FDN format | Apache Parquet (open format) |
| Data storage location | Snowflake-managed storage | External Volume (customer-owned cloud storage) |
| Access from other engines | Not supported (Snowflake only) | Direct access from Spark, Trino, Flink, etc. |
| DML performance | Highly optimized | Slight overhead compared with standard tables |
| Storage cost | Snowflake storage pricing | Cloud storage pricing (S3 / GCS / Azure Blob) |
| Vendor lock-in | Yes | No (open format) |
-- 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;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?
正解: 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.
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.
Practice with certification-focused question sets
無料で問題を解いてみる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.
Snowflake Certifications: All 11 Exams Explained (2026)
Every SnowPro certification — Associate, Core, Specialty, Ad...
Snowflake Exam Difficulty Ranking: All 11 Certs Compared (2026)
All 11 SnowPro exams ranked by difficulty with study-time es...
Snowflake Study Guide: Fastest Pass Route by Exam (2026)
How to pass SnowPro certifications efficiently — official ma...
SnowPro Core (COF-C03): Complete Exam Guide (2026)
Pass the SnowPro Core exam — six domains, scope, sample ques...
SnowPro Associate Platform (SOL-C01): Complete Guide (2026)
The entry-level SnowPro Associate exam — scope, weighting, s...