Intermedio 2 min de lectura

Tablas Iceberg en Snowflake

Crea, modifica y consulta tablas Apache Iceberg con Snowflake como engine. Aprende la diferencia entre managed y unmanaged Iceberg tables.

Tipos de tablas Iceberg en Snowflake

Snowflake ofrece dos modos de trabajo con Iceberg:

TipoQuién escribeCatálogoPara qué
Snowflake-managedSnowflakeSnowflakeSnowflake escribe en tu S3/ADLS
Externally managedOtro 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.

#iceberg #tablas-iceberg #external-volume #create-iceberg-table