

 Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del parche 198. Las UDF de Python existentes seguirán funcionando hasta el 30 de junio de 2026. Para obtener más información, consulte la [publicación del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Comandos SQL
<a name="iceberg-writes-sql-syntax"></a>

Las tablas de Apache Iceberg en Amazon Redshift proporcionan una forma eficaz de administrar grandes conjuntos de datos de análisis en el lago de datos. Estas tablas admiten las transacciones ACID, la evolución de los esquemas y las capacidades de viajar en el tiempo, a la vez que mantienen un alto rendimiento para las cargas de trabajo de análisis. Con las tablas de Apache Iceberg, puede organizar y particionar los datos de manera eficiente, controlar los formatos y la compresión de los archivos e integrarlos sin problemas con otros servicios de AWS. 

Puede crear tablas de Iceberg particionadas y no particionadas mediante los comandos `CREATE TABLE ... USING ICEBERG` y `CREATE TABLE ... USING ICEBERG AS SELECT`. Puede hacer referencia a las tablas de iceberg mediante una notación de esquema externa (`external_schema.table_name`) o una notación de tres partes (`"catalog_name".database_name.table_name`). Los ejemplos de esta sección demuestran ambos métodos.

Después de crear una tabla, puede agregar datos mediante comandos `INSERT` estándar. Tenga en cuenta que, si bien Amazon Redshift funciona con muchos tipos de datos de Iceberg, es posible que necesite convertir algunos formatos de datos al insertar información. 

Puede ver las tablas de Iceberg mediante un comando `SHOW TABLES`. Si desea eliminar una tabla de AWS Glue Data Catalog, puede usar el comando `DROP TABLE`. Tenga en cuenta que esto solo elimina el registro de la tabla. Los datos reales permanecerán almacenados hasta que los elimine de forma independiente.

También puede modificar los datos existentes mediante los comandos `DELETE`, `UPDATE` y `MERGE`. Todas las demás instrucciones SQL, como `ALTER TABLE`, aún no se admiten en las tablas de Iceberg.

Es posible escribir en una tabla de iceberg que no haya creado Amazon Redshift. Sin embargo, hay algunas limitaciones:
+ La tabla debe ser una tabla de Iceberg v2.
+ La tabla debe usar Parquet como formato de datos predeterminado.
+ La tabla no debe tener la compresión de metadatos establecida en True.
+ La tabla no debe habilitar la escritura, auditoría y publicación (WAP).

En las secciones siguientes, se muestra la sintaxis SQL para crear, insertar, modificar y administrar tablas de Iceberg en Amazon Redshift.

**Contents**
+ [CREATE TABLE](#iceberg-writes-create-table)
+ [CREATE TABLE AS SELECT](#iceberg-writes-create-table-as-select)
+ [SHOW TABLE](#iceberg-writes-show-table)
+ [INSERT INTO](#iceberg-writes-insert-into)
+ [DELETE](#iceberg-writes-delete)
+ [UPDATE](#iceberg-writes-update)
+ [MERGE](#iceberg-writes-merge)
+ [DROP TABLE](#iceberg-writes-drop-table)

## CREATE TABLE
<a name="iceberg-writes-create-table"></a>

```
CREATE TABLE [IF NOT EXISTS] {{<external_schema>}}.{{<table_name>}} (
  column_name data_type [, ...]
)
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='<compression_value>')]
```

También puede utilizar la notación de tres partes para buckets de tablas de S3:

```
CREATE TABLE "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} (
  column_name data_type [, ...]
)
USING ICEBERG
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='<compression_value>')]
```

Tenga en cuenta que `{{<external_schema>}}` debe tener un nombre de esquema externo existente en el que se creará la tabla externa. Para obtener más información sobre cómo crear y administrar esquemas externos, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) en la documentación de Amazon Redshift.

La cláusula `LOCATION` define la ubicación de la tabla para esta tabla de Iceberg recién creada. Para las tablas de Amazon S3, `LOCATION` no se puede especificar, ya que la ubicación de la tabla viene determinada por el catálogo de tablas de Amazon S3 (`s3tablescatalog`). 

En todos los demás casos, `LOCATION` es obligatorio y debe ser una ubicación vacía, lo que significa que no hay ningún objeto de Amazon S3 existente que comparta este mismo bucket y el mismo prefijo. Tenga en cuenta que la región del bucket de Amazon S3 debe ser la misma que la región del clúster de Amazon Redshift. 

Sin embargo, AWS proporciona un método para replicar los datos de las tablas de Iceberg almacenadas en AWS Glue Data Catalog en una Región de AWS en una Región de AWS diferente, lo que permite replicar la escritura en una región diferente. Para obtener más información, consulte [Replicar los datos en Regiones de AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-workloads.html#workloads-replication).

`PARTITIONED BY` define la partición de tablas de Iceberg. Amazon Redshift admite todas las transformaciones de particiones de Iceberg v2, excepto `void`. Esta es la lista de transformaciones admitidas:
+ **identity**
+ **bucket[N]**
+ **truncar[W]**
+ **año**
+ **mes**
+ **día**
+ **hora**

Para ver las definiciones completas de estas transformaciones y los tipos de datos compatibles, consulte [Partition Transforms](https://iceberg.apache.org/spec/#partition-transforms) en la documentación de Apache Iceberg.

`PARTITIONED BY` admite la partición de varios niveles. Por ejemplo, puede ejecutar el comando siguiente:

```
CREATE TABLE ...
USING ICEBERG
LOCATION ...
PARTITIONED BY (bucket(16, id), year(ship_date));
```

Sin embargo, Amazon Redshift no admite el uso de una sola columna en más de una transformación. Por ejemplo, no se admite la siguiente sintaxis:

```
CREATE TABLE ...
USING ICEBERG
LOCATION ...
PARTITIONED BY (bucket(16, ship_date), year(ship_date));
```

La cláusula `TABLE PROPERTIES` define las propiedades de tabla adicionales de esta tabla de Iceberg. La única propiedad de la tabla que admitimos es `compression_type` que define la compresión predeterminada del archivo de datos de Parquet. Si no se especifica, `snappy` se utiliza como códec de compresión. Los valores posibles de `compression_type` son `zstd`, `brotli`, `gzip`, `snappy` y `uncompressed`.

**nota**  
`CREATE TABLE ... LIKE ...` no es compatible con tablas de Iceberg. Las tablas de Iceberg tampoco admiten restricciones ni atributos de columna como sí lo hace la tabla de RMS.

Como alternativa, puede crear y rellenar una tabla de iceberg en una sola operación mediante `CREATE TABLE AS SELECT`:

## CREATE TABLE AS SELECT
<a name="iceberg-writes-create-table-as-select"></a>

```
CREATE TABLE {{<external_schema>}}.{{<table_name>}} [(
  column_name[, ...]
)]
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='{{<compression-value>}}')]
AS
SELECT query
```

También puede utilizar la notación de tres partes para crear tablas en catálogos montados automáticamente:

```
CREATE TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}} [(
  column_name[, ...]
)]
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='{{<compression-value>}}')]
AS
SELECT query
```

Es similar a la instrucción `CREATE TABLE`, excepto que `CREATE` va seguida de una instrucción `SELECT` para rellenar la tabla con los resultados de la consulta `SELECT`.

La cláusula `CREATE TABLE` ya no permite especificar los tipos de datos, ya que los tipos de datos de las columnas los decidirá la consulta `SELECT`.

Si la consulta `SELECT` produce un error por algún motivo, esta consulta producirá un error y no se creará la tabla de Iceberg.

Puede ver la estructura de las tablas de Iceberg mediante `SHOW TABLE`:

## SHOW TABLE
<a name="iceberg-writes-show-table"></a>

```
SHOW TABLE {{<external_schema>}}.{{<table_name>}}
```

Puede usar también la notación de tres partes con catálogos montados automáticamente:

```
SHOW TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}}
```

`SHOW TABLE` muestra la instrucción `CREATE TABLE` para la tabla de Iceberg. El comando mostrará los resultados adecuados en función del tipo de la tabla. A continuación, se presenta un ejemplo de la salida de `SHOW TABLE` para la tabla de Iceberg:

```
CREATE TABLE my_schema.items (id int, price decimal(5, 2))
USING ICEBERG
LOCATION 's3://my_s3_bucket/items/'
PARTITIONED BY (bucket(16, id))
TABLE PROPERTIES ('compression_type'='snappy')
```

**nota**  
Para las tablas de Amazon S3, dado que la ubicación de la tabla la administra el catálogo de tablas de Amazon S3, la cláusula `LOCATION` se omitirá en los resultados de `SHOW TABLE`.

Después de crear tablas, puede agregar datos mediante `INSERT INTO`:

## INSERT INTO
<a name="iceberg-writes-insert-into"></a>

```
INSERT INTO {{<external_schema>}}.{{<table_name>}} [(column_name [, ...])] VALUES (...)
INSERT INTO {{<external_schema>}}.{{<table_name>}} [(column_name [, ...])] (SELECT query)

-- Using three-part notation for S3 table buckets:
INSERT INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [(column_name [, ...])] VALUES (...)
INSERT INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [(column_name [, ...])] (SELECT query)
```

Puede `INSERT INTO` la tabla de Iceberg existente mediante la sintaxis anterior. Si se utiliza la cláusula `VALUES`, se proporcionan los valores de las columnas mostradas por `column_name` o de todas las columnas si se omite una parte de `column_name`.

Cuando los datos se insertan en una tabla particionada, las nuevas filas se distribuyen de acuerdo con la especificación de partición predefinida. Si por algún motivo la consulta `SELECT` produce un error, la consulta producirá un error y no se insertará ningún dato en la tabla de Iceberg.

## DELETE
<a name="iceberg-writes-delete"></a>

La consulta `DELETE` de la tabla de Iceberg utiliza la sintaxis `DELETE` existente en la tabla de RMS:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
DELETE [ FROM ] {{iceberg_table}}
[ { USING } {{table_name, ...}} ] [ WHERE {{condition}} ]
```

También puede utilizar la notación de tres partes para buckets de tablas de S3:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
DELETE [ FROM ] "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}}
[ { USING } {{table_name, ...}} ] [ WHERE {{condition}} ]
```

Se puede hacer referencia a `{{iceberg_table}}` mediante el formulario `{{<external_schema>}}.{{<external_table_name>}}` o utilizar la notación de 3 partes para el catálogo montado automáticamente. Consulte [Referencia a tablas de Iceberg en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

`{{table_name}}` incluida en la cláusula `USING` se utilizará para unirla a la tabla de destino y eliminar las filas que cumplan con la condición `WHERE`. `{{table_name}}` puede ser una tabla de Iceberg o una tabla de RMS de Amazon Redshift.

Como Iceberg usa un esquema de particiones ocultas, el usuario puede usar la consulta `DELETE` para eliminar particiones y lograr el mismo efecto que `ALTER TABLE ... DROP PARTITION ...` para tablas de Hive.

Por ejemplo, cuando hemos particionado la tabla de Iceberg como se muestra a continuación:

```
CREATE TABLE my_external_schema.lineitem
(l_item_id int,
 l_ship_date varchar,
 ...
)
USING ICEBERG
LOCATION ...
PARTITIONED BY l_ship_date;
```

Luego podemos eliminar fácilmente una partición usando una consulta como esta:

```
DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';
```

para consultas como esta, Amazon Redshift optimizará la ejecución para realizar solo operaciones de metadatos y cortocircuitar la ejecución. Por lo tanto, a diferencia de una consulta de `DELETE` normal, la consulta de eliminación exclusiva de metadatos no muestra los pasos de ejecución en `EXPLAIN`:

```
explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';

 QUERY PLAN
------------
"XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)"
(0 rows)
```

## UPDATE
<a name="iceberg-writes-update"></a>

La sintaxis de consulta de `UPDATE` de la tabla de Iceberg es muy similar a la sintaxis de `UPDATE` existente de la tabla de RMS:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
UPDATE {{iceberg_table}} [ [ AS ] alias ] SET column = { {{expression}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

También puede utilizar la notación de tres partes para buckets de tablas de S3:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
UPDATE "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [ [ AS ] alias ] SET column = { {{expression}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

Se puede hacer referencia a `{{iceberg_table}}` mediante el formulario `{{<external_schema>}}.{{<external_table_name>}}` o utilizar la notación de 3 partes para el catálogo montado automáticamente. Consulte [Referencia a tablas de Iceberg en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

Puede actualizar una tabla al hacer referencia a información de otras tablas. Enumere estas otras tablas en la cláusula FROM o use una subconsulta como parte de la condición WHERE. Las tablas de origen pueden ser tablas de Iceberg o tablas de RMS de Amazon Redshift.

`UPDATE` también se puede ejecutar en una tabla particionada. Cuando `UPDATE` cambia los valores de las columnas que pertenecen a la especificación de partición actual, la nueva fila actualizada se insertará en la nueva partición en función del valor recién actualizado.

Por ejemplo, cuando hemos particionado una tabla de Iceberg como se muestra a continuación:

```
CREATE TABLE my_external_schema.lineitem
(l_item_id int,
 l_ship_date varchar,
 ...
)
USING ICEBERG
LOCATION ...
PARTITIONED BY l_ship_date;

INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);
```

Y cuando ejecutamos la siguiente consulta de actualización:

```
UPDATE my_external_schema.lineitem SET l_ship_date = '20260101'
WHERE l_item_id = 10099;
```

moveremos esta fila con `l_item_id` 10 099 de una partición `20251231` a una `20260101` nueva.

También es importante tener en cuenta que es posible que `UPDATE` tenga varios valores candidatos. Tenga en cuenta la consulta siguiente:

```
CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...;
CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...;
INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30);
INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50);
UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;
```

en este caso, y1 puede ser 40 o 50. El resultado no es determinista. Puede establecer el parámetro de configuración `error_on_nondeterministic_update` en true para provocar un error de consulta cuando se produzca ese caso. Esto es coherente con el comportamiento `UPDATE` de la tabla de RMS existente. Para obtener más información, consulte [error\_on\_nondeterministic\_update](https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html).

## MERGE
<a name="iceberg-writes-merge"></a>

La consulta `MERGE` fusiona de forma condicional las filas de una tabla de origen con una tabla de destino. Comparte la misma sintaxis de consulta de `MERGE` que la tabla de RMS existente:

```
MERGE INTO {{target_iceberg_table}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_name}} = { {{expr}} } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( {{col_name}} [,...] ) ]
  VALUES ( { {{expr}} } [, ...] )
| REMOVE DUPLICATES ]
```

También puede utilizar la notación de tres partes para buckets de tablas de S3:

```
MERGE INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_name}} = { {{expr}} } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( {{col_name}} [,...] ) ]
  VALUES ( { {{expr}} } [, ...] )
| REMOVE DUPLICATES ]
```

Se puede hacer referencia a `{{target_iceberg_table}}` mediante el formulario `{{<external_schema>}}.{{<external_table_name>}}` o utilizar la notación de 3 partes para el catálogo montado automáticamente. Consulte [Referencia a tablas de Iceberg en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

`{{source_table}}` puede ser una tabla de Iceberg o una tabla de RMS de Amazon Redshift.

Cuando se usa `REMOVE DUPLICATES`, el comando `MERGE` usa el modo simplificado. Para obtener más información sobre el modo simplificado, consulte el [documento de comandos](https://docs.aws.amazon.com/redshift/latest/dg/r_MERGE.html) `MERGE` original.

Mientras ejecuta la consulta `MERGE`, Amazon Redshift genera y almacena archivos de datos intermedios en la ubicación de la tabla de destino. Estos archivos se recopilarán como elementos no utilizados al final de la consulta. Por este motivo, la consulta `MERGE` necesitaría el permiso `DELETE` en el bucket de Amazon S3 para funcionar correctamente. Si se produce un error en la operación de recopilación de elementos no utilizados, se generaría un error de permiso insuficiente. En el caso de las tablas de Amazon S3, el servicio de tablas de Amazon S3 administra la recopilación de elementos no utilizados. Por lo tanto, el permiso `DELETE` no es necesario para ejecutar la consulta `MERGE`.

## DROP TABLE
<a name="iceberg-writes-drop-table"></a>

Para eliminar una tabla de Iceberg del catálogo, utilice el comando `DROP TABLE`:

```
DROP TABLE {{<external_schema>}}.{{<table_name>}}
```

Puede usar también la notación de tres partes con catálogos montados automáticamente:

```
DROP TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}}
```

La eliminación de una tabla de Iceberg es una operación que se realiza solo con metadatos. Elimina la entrada de la tabla de AWS Glue Data Catalog y del catálogo de tablas de Amazon S3, si se trata de una tabla de Amazon S3. Amazon Redshift no limpia ni elimina ningún archivo de datos o archivos de metadatos existentes en la ubicación de la tabla. Puede utilizar las características en AWS Glue y tablas de Amazon S3 para eliminar los archivos huérfanos. Para AWS Glue, consulte [Eliminación de archivos huérfanos](https://docs.aws.amazon.com/glue/latest/dg/orphan-file-deletion.html). Para ver las tablas de Amazon S3, consulte [Mantenimiento de tablas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html).