Tipos de tablas Iceberg en Snowflake
Snowflake ofrece dos modos de trabajo con Iceberg:
| Tipo | Quién escribe | Catálogo | Para qué |
|---|---|---|---|
| Snowflake-managed | Snowflake | Snowflake | Snowflake escribe en tu S3/ADLS |
| Externally managed | Otro motor (Spark, etc.) | AWS Glue, Unity, etc. | Snowflake solo lee |
Prerrequisito: External Volume
Antes de crear una tabla Iceberg, necesitas un External Volume que apunte a tu almacenamiento cloud:
-- External Volume para S3
CREATE EXTERNAL VOLUME mi_volumen_s3
STORAGE_LOCATIONS = (
(
NAME = 'us-east-1'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://mi-bucket-iceberg/data/'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789:role/snowflake-role'
)
);
-- Verificar la configuración (Snowflake genera un external ID para el trust)
DESC EXTERNAL VOLUME mi_volumen_s3;
Tabla Iceberg gestionada por Snowflake
Snowflake escribe los archivos Parquet y metadata en tu S3:
-- Crear tabla Iceberg (los datos van a S3 pero Snowflake los gestiona)
CREATE ICEBERG TABLE ventas_iceberg (
venta_id NUMBER,
fecha DATE,
producto_id NUMBER,
monto FLOAT,
region VARCHAR
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'mi_volumen_s3'
BASE_LOCATION = 'ventas/'; -- subdirectorio en el S3
-- Insertar datos — Snowflake escribe Parquet en S3
INSERT INTO ventas_iceberg
SELECT * FROM ventas_legacy;
-- Consultar igual que cualquier tabla
SELECT region, SUM(monto) AS total
FROM ventas_iceberg
WHERE fecha >= '2026-01-01'
GROUP BY 1;
Schema Evolution
Una de las mayores ventajas de Iceberg — puedes evolucionar el esquema sin reescribir datos:
-- Agregar una columna (no necesitas reescribir los archivos existentes)
ALTER ICEBERG TABLE ventas_iceberg
ADD COLUMN canal_venta VARCHAR;
-- Renombrar una columna
ALTER ICEBERG TABLE ventas_iceberg
RENAME COLUMN monto TO monto_usd;
-- Los datos anteriores sin la nueva columna muestran NULL — sin errores
SELECT * FROM ventas_iceberg LIMIT 5;
Time Travel en Iceberg
-- Ver snapshots disponibles
SELECT *
FROM TABLE(SYSTEM$ICEBERG_SNAPSHOT_INFORMATION('ventas_iceberg'));
-- Consultar datos en un snapshot anterior
SELECT COUNT(*)
FROM ventas_iceberg
AT (SNAPSHOT => '1234567890');
-- O por timestamp
SELECT COUNT(*)
FROM ventas_iceberg
AT (TIMESTAMP => '2026-01-15 10:00:00'::TIMESTAMP);
Tablas Iceberg externas (solo lectura)
Para leer tablas Iceberg creadas por Spark u otros motores:
-- Usando AWS Glue como catálogo
CREATE CATALOG INTEGRATION glue_catalog
CATALOG_SOURCE = GLUE
CATALOG_NAMESPACE = 'mi_glue_database'
TABLE_FORMAT = ICEBERG
GLUE_AWS_ROLE_ARN = 'arn:aws:iam::123456789:role/glue-role'
GLUE_CATALOG_ID = '123456789012'
GLUE_REGION = 'us-east-1'
ENABLED = TRUE;
-- Crear tabla que apunta a la tabla Iceberg de Glue
CREATE ICEBERG TABLE ordenes_externas
EXTERNAL_VOLUME = 'mi_volumen_s3'
CATALOG = 'glue_catalog'
CATALOG_TABLE_NAME = 'ordenes';
Próximos pasos
En la siguiente lección configuramos External Volumes en detalle para AWS, Azure y GCP.