

 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/). 

# Tablas externas para Redshift Spectrum
<a name="c-spectrum-external-tables"></a>

En este tema se describe cómo crear y usar tablas externas con Redshift Spectrum. Las tablas externas son tablas que se utilizan como referencias para acceder a datos fuera del clúster de Amazon Redshift. Estas tablas contienen metadatos sobre los datos externos que lee Redshift Spectrum.



La tabla externa se crea en un esquema externo. Para crear tablas externas, debe ser el propietario del esquema externo o un superusuario. Para transferir la propiedad de un esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para cambiar el propietario. En el siguiente ejemplo, se modifica el propietario del esquema `spectrum_schema` a `newowner`.

```
alter schema spectrum_schema owner to newowner;
```

Para ejecutar una consulta de Redshift Spectrum, necesita los siguientes permisos:
+ Permiso de uso para el esquema 
+ Permiso para crear tablas temporales en la base de datos actual 

En el siguiente ejemplo, se concede permiso de uso para el esquema `spectrum_schema` al grupo de usuarios `spectrumusers`.

```
grant usage on schema spectrum_schema to group spectrumusers;
```

En el siguiente ejemplo, se concede un permiso temporal para la base de datos `spectrumdb` al grupo de usuarios `spectrumusers`. 

```
grant temp on database spectrumdb to group spectrumusers;
```

Puede crear una tabla externa en Amazon Redshift, AWS Glue, Amazon Athena o un metastore de Apache Hive. Para obtener más información, consulte [Introducción al uso de AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/getting-started.html) en la *Guía para desarrolladores de AWS Glue*, [Introducción](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html) en la *Guía del usuario de Amazon Athena*, o bien, [Apache Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive.html) en la *Guía para desarrolladores de Amazon EMR*. 

Si la tabla externa se define en AWS Glue, Athena o un metastore de Hive, primero debe crear un esquema externo que referencie la base de datos externa. A continuación, puede referenciar la tabla externa en la instrucción SELECT al colocar como prefijo el nombre del esquema en el nombre de la tabla, sin que sea necesario crear la tabla en Amazon Redshift. Para obtener más información, consulte [Esquemas externos en Amazon Redshift Spectrum](c-spectrum-external-schemas.md). 

Para permitir que Amazon Redshift visualice las tablas en el AWS Glue Data Catalog, agregue `glue:GetTable` al rol de IAM de Amazon Redshift. De lo contrario, es posible que obtenga un error similar al siguiente.

```
RedshiftIamRoleSession is not authorized to perform: glue:GetTable on resource: *;
```

Por ejemplo, supongamos que tiene una tabla externa denominada `lineitem_athena` que está definida en un catálogo externo de Athena. En este caso, puede definir un esquema externo denominado `athena_schema` y, luego, consultar la tabla utilizando la siguiente instrucción SELECT.

```
select count(*) from athena_schema.lineitem_athena;
```

Para definir una tabla externa en Amazon Redshift, utilice el comando [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). La instrucción de tabla externa define las columnas de la tabla, el formato de los archivos de datos y la ubicación de los datos en Amazon S3. Redshift Spectrum examina los archivos en la carpeta especificada y en cualquier subcarpeta. Redshift Spectrum ignora los archivos ocultos y los archivos que comienzan con un punto, un guion bajo o una marca hash ( . , \$1, o \$1) o que finalizan con una tilde (\$1). 

En el siguiente ejemplo, se crea una tabla denominada SALES en el esquema externo de Amazon Redshift `spectrum`. Los datos están en archivos de texto delimitados por tabulaciones.

```
create external table spectrum.sales(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
row format delimited
fields terminated by '\t'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales/'
table properties ('numRows'='172000');
```

Para ver las tablas externas, consulte la vista del sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md). 

## Pseudocolumnas
<a name="c-spectrum-external-tables-pseudocolumns"></a>

‎De forma predeterminada, Amazon Redshift crea tablas externas con las pseudocolumnas `$path`, `$size` y `$spectrum_oid`. Seleccione la columna `$path` para ver la ruta a los archivos de datos en Simple Storage Service (Amazon S3) y seleccione la columna `$size` para ver el tamaño de los archivos de datos de cada fila devuelta por una consulta. La columna `$spectrum_oid` proporciona la capacidad de realizar consultas correlacionadas con Redshift Spectrum. Para ver un ejemplo, consulta [Ejemplo: Realización de subconsultas correlacionadas en Redshift Spectrum](c_performing-correlated-subqueries-spectrum.md). Debe delimitar los nombres de las columnas `$path`, `$size` y `$spectrum_oid` con comillas dobles. Una cláusula SELECT \$1 no devuelve las pseudocolumnas. Debe incluir explícitamente los nombres de columna `$path`, `$size` y‎ `$spectrum_oid` en la consulta, tal y como se muestra en el siguiente ejemplo.

```
select "$path", "$size", "$spectrum_oid"
from spectrum.sales_part where saledate = '2008-12-01';
```

Puede desactivar la creación de pseudocolumnas para una sesión estableciendo el parámetro de configuración `spectrum_enable_pseudo_columns` ‎en `false`. Para obtener más información, consulte [spectrum\$1enable\$1pseudo\$1columns](r_spectrum_enable_pseudo_columns.md). También puede desactivar solo la pseudocolumna `$spectrum_oid` configurando `enable_spectrum_oid` en `false`. Para obtener más información, consulte [enable\$1spectrum\$1oid](r_spectrum_enable_spectrum_oid.md). Sin embargo, desactivar la pseudocolumna `$spectrum_oid` también desactiva la compatibilidad con consultas correlacionadas con Redshift Spectrum.

**importante**  
‎Si se selecciona `$size`, `$path` o `$spectrum_oid`, se aplicarán cargos, ya que Redshift Spectrum analiza los archivos de datos de Simple Storage Service (Amazon S3) para determinar el tamaño del conjunto de resultados. Para obtener más información, consulte [Precios de Amazon Redshift](https://aws.amazon.com/redshift/pricing/).

### Ejemplo de pseudocolumnas
<a name="c-spectrum-external-tables-pseudocolumns-example"></a>

El siguiente ejemplo devuelve el tamaño total de los archivos de datos relacionados de una tabla externa.

```
select distinct "$path", "$size"
from spectrum.sales_part;

 $path                                                                    | $size
--------------------------------------------------------------------------+-------
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ |  1616
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/ |  1644
```

## Partición de tablas externas de Redshift Spectrum
<a name="c-spectrum-external-tables-partitioning"></a>

Cuando particiona datos, puede restringir la cantidad de datos que Redshift Spectrum examina al filtrar mediante una clave de partición. Puede particionar los datos por cualquier clave. 

Una práctica habitual es particionar datos según el tiempo. Por ejemplo, puede seleccionar particionar por año, mes, fecha y hora. Si tiene datos que vienen de distintos orígenes, puede particionar por identificador de origen de datos y fecha. 

En el siguiente procedimiento, se describe cómo particionar datos.

**Pasos para particionar datos**

1. Almacene los datos en carpetas en Amazon S3 según la clave de partición. 

   Cree una carpeta para cada valor de partición y nombre esa carpeta con la clave de partición y el valor. Por ejemplo, si particiona por fecha, puede tener carpetas que se llamen `saledate=2017-04-01`, `saledate=2017-04-02` y, así, sucesivamente. Redshift Spectrum examina los archivos en la carpeta de la partición y en todas las subcarpetas. Redshift Spectrum ignora los archivos ocultos y los archivos que comienzan con un punto, un guion bajo o una marca hash ( . , \$1, o \$1) o que finalizan con una tilde (\$1). 

1. Cree una tabla externa y especifique la clave de partición en la cláusula PARTITIONED BY. 

   La clave de partición no puede ser el nombre de una columna de tabla. Los tipos de datos pueden ser SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE o TIMESTAMP. 

1. Agregue las particiones. 

   Agregue cada una de las particiones con [ALTER TABLE](r_ALTER_TABLE.md) … ADD PARTITION y especifique el valor de clave y la columna de partición, así como la ubicación de la carpeta de partición en Amazon S3. Puede agregar múltiples particiones en una única instrucción ALTER TABLE … ADD. En el siguiente ejemplo, se agregan particiones para `'2008-01'` y `'2008-03'`.

   ```
   alter table spectrum.sales_part add
   partition(saledate='2008-01-01') 
   location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'
   partition(saledate='2008-03-01') 
   location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
   ```
**nota**  
Si usa el catálogo de AWS Glue, puede agregar hasta 100 particiones mediante una única instrucción ALTER TABLE.

### Ejemplos de partición de datos
<a name="c-spectrum-external-tables-partitioning-example"></a>

En este ejemplo, se crea una tabla externa que está particionada por una sola clave de partición y una tabla externa que está particionada por dos claves de partición.

Los datos de muestra para este ejemplo se encuentran en un bucket de Amazon S3 que brinda acceso de lectura a todos los usuarios autenticados de AWS. El clúster y los archivos de datos externos deben estar en la misma Región de AWS. El bucket de datos de muestra está en la región Este de EE. UU. (Norte de Virginia) (us-east-1). Para obtener acceso a los datos utilizando Redshift Spectrum, el clúster también debe estar en us-east-2. Para que se muestren las carpetas en Amazon S3, ejecute los siguientes comandos.

```
aws s3 ls s3://redshift-downloads/tickit/spectrum/sales_partition/
```

```
PRE saledate=2008-01/
PRE saledate=2008-03/
PRE saledate=2008-04/
PRE saledate=2008-05/
PRE saledate=2008-06/
PRE saledate=2008-12/
```

Si aún no tiene un esquema externo, ejecute el siguiente comando. Sustituya el nombre de recurso de Amazon (ARN) para su rol de AWS Identity and Access Management (IAM).

```
create external schema spectrum
from data catalog
database 'spectrumdb'
iam_role 'arn:aws:iam::123456789012:role/myspectrumrole'
create external database if not exists;
```

#### Ejemplo 1: Particionar con una sola clave de partición
<a name="c-spectrum-external-tables-single-partition-example"></a>

En el siguiente ejemplo, se crea una tabla externa que se particiona por mes.

Para crear una tabla externa particionada por mes, ejecute el siguiente comando.

```
create external table spectrum.sales_part(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
partitioned by (saledate char(10))
row format delimited
fields terminated by '|'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales_partition/'
table properties ('numRows'='172000');
```

Para agregar las particiones, ejecute el siguiente comando ALTER TABLE.

```
alter table spectrum.sales_part add
partition(saledate='2008-01') 
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'

partition(saledate='2008-03') 
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/'

partition(saledate='2008-04') 
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';
```

Para seleccionar los datos de la tabla particionada, ejecute la siguiente consulta.

```
select top 5 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid) 
from spectrum.sales_part, event
where spectrum.sales_part.eventid = event.eventid
  and spectrum.sales_part.pricepaid > 30
  and saledate = '2008-01'
group by spectrum.sales_part.eventid
order by 2 desc;
```

```
eventid | sum     
--------+---------
   4124 | 21179.00
   1924 | 20569.00
   2294 | 18830.00
   2260 | 17669.00
   6032 | 17265.00
```

Para ver particiones de la tabla externa, consulte la vista del sistema [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md).

```
select schemaname, tablename, values, location from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values      | location                                                                
-----------+------------+-------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-03"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
```

#### Ejemplo 2: Particionar con varias claves de partición
<a name="c-spectrum-external-tables-multi-partition-example"></a>

Para crear una tabla externa particionada por `date` y `eventid`, ejecute el siguiente comando.

```
create external table spectrum.sales_event(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
partitioned by (salesmonth char(10), event integer)
row format delimited
fields terminated by '|'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/salesevent/'
table properties ('numRows'='172000');
```

Para agregar las particiones, ejecute el siguiente comando ALTER TABLE.

```
alter table spectrum.sales_event add
partition(salesmonth='2008-01', event='101') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=101/'

partition(salesmonth='2008-01', event='102') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=102/'

partition(salesmonth='2008-01', event='103') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=103/'

partition(salesmonth='2008-02', event='101') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=101/'

partition(salesmonth='2008-02', event='102') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=102/'

partition(salesmonth='2008-02', event='103') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=103/'

partition(salesmonth='2008-03', event='101') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=101/'

partition(salesmonth='2008-03', event='102') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=102/'

partition(salesmonth='2008-03', event='103') 
location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=103/';
```

Ejecute la siguiente consulta para seleccionar los datos de la tabla particionada.

```
select spectrum.sales_event.salesmonth, event.eventname, sum(spectrum.sales_event.pricepaid) 
from spectrum.sales_event, event
where spectrum.sales_event.eventid = event.eventid
  and salesmonth = '2008-02'
	and (event = '101'
	or event = '102'
	or event = '103')
group by event.eventname, spectrum.sales_event.salesmonth
order by 3 desc;
```

```
salesmonth | eventname       | sum    
-----------+-----------------+--------
2008-02    | The Magic Flute | 5062.00
2008-02    | La Sonnambula   | 3498.00
2008-02    | Die Walkure     |  534.00
```

## Asignación de columnas de tablas externas a columnas ORC
<a name="c-spectrum-column-mapping-orc"></a>

Las tablas externas de Amazon Redshift Spectrum se utilizan para consultar datos que están en archivos con formato ORC. El formato ORC (Optimized Row Columnar) es un archivo de almacenamiento organizado en columnas que admite estructuras de datos anidadas. Para obtener más información sobre la consulta de datos anidados, consulte [Consultas de datos anidados con Amazon Redshift Spectrum](tutorial-query-nested-data.md#tutorial-nested-data-overview). 

Cuando crea una tabla externa que hace referencia a datos de un archivo ORC, debe asignar cada columna de la tabla externa a una columna de los datos de ORC. Para ello, puede utilizar uno de los siguientes métodos:
+ [Asignación por posición](#orc-mapping-by-position)
+ [Asignación por nombre de columna](#orc-mapping-by-name) 

La asignación por nombre de columna es el valor predeterminado. 

### Asignación por posición
<a name="orc-mapping-by-position"></a>

En la asignación por posición, la primera columna definida en la tabla externa se asigna a la primera columna del archivo de datos de ORC y lo mismo ocurre con la segunda, la tercera, etc. En la asignación por posición, es necesario que el orden de las columnas de la tabla externa y del archivo ORC coincidan. Si el orden no coincide, puede asignar las columnas por nombre. 

**importante**  
En versiones anteriores, Redshift Spectrum utilizaba la asignación por posición de manera predeterminada. Si necesita seguir utilizando la asignación por posición en las tablas existentes, establezca la propiedad `orc.schema.resolution` de la tabla en `position`, tal y como se muestra en el siguiente ejemplo.   

```
alter table spectrum.orc_example 
set table properties('orc.schema.resolution'='position');
```

Por ejemplo, la tabla `SPECTRUM.ORC_EXAMPLE` se define del modo siguiente. 

```
create external table spectrum.orc_example(
int_col int,
float_col float,
nested_col struct<
  "int_col" : int,
  "map_col" : map<int, array<float >>
   >
) stored as orc
location 's3://example/orc/files/';
```

La estructura de la tabla puede abstraerse tal y como se muestra a continuación. 

```
• 'int_col' : int
• 'float_col' : float
• 'nested_col' : struct
   o 'int_col' : int
   o 'map_col' : map
      - key : int
      - value : array
         - value : float
```

El archivo ORC subyacente tiene la siguiente estructura de archivos.

```
• ORC file root(id = 0)
   o 'int_col' : int (id = 1)
   o 'float_col' : float (id = 2)
   o 'nested_col' : struct (id = 3)
      - 'int_col' : int (id = 4)
      - 'map_col' : map (id = 5)
         - key : int (id = 6)
         - value : array (id = 7)
            - value : float (id = 8)
```

En este ejemplo, puede asignar cada columna de la tabla externa a una columna del archivo ORC exclusivamente por posición. En el siguiente ejemplo, se muestra la asignación.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/c-spectrum-external-tables.html)

### Asignación por nombre de columna
<a name="orc-mapping-by-name"></a>

En la asignación por nombre, las columnas de una tabla externa se asignan a columnas de los archivos ORC del mismo nivel que tienen el mismo nombre. 

Por ejemplo, supongamos que desea asignar la tabla del ejemplo anterior, `SPECTRUM.ORC_EXAMPLE`, a un archivo ORC que utiliza la siguiente estructura de archivos.

```
• ORC file root(id = 0)
   o 'nested_col' : struct (id = 1)
      - 'map_col' : map (id = 2)
         - key : int (id = 3)
         - value : array (id = 4)
            - value : float (id = 5)
      - 'int_col' : int (id = 6)
   o 'int_col' : int (id = 7)
   o 'float_col' : float (id = 8)
```

Con la asignación por posición, Redshift Spectrum intentaría realizar la siguiente asignación. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/c-spectrum-external-tables.html)

Si consulta una tabla con la asignación por posición anterior, el comando SELECT no realiza correctamente la validación de tipos porque las estructuras son diferentes. 

Puede asignar la misma tabla externa a las dos estructuras de archivos que se muestran en los ejemplos anteriores utilizando la asignación por nombre de columna. Las columnas `int_col`, `float_col` y `nested_col` de la tabla se asignan por nombre a las columnas del archivo ORC que tienen el mismo nombre. La columna `nested_col` se la tabla externa es una columna `struct` con las subcolumnas `map_col` e `int_col`. Las subcolumnas también se asignan correctamente a las columnas correspondientes del archivo ORC a través del nombre. 

## Creación de tablas externas para datos administrados en Apache Hudi
<a name="c-spectrum-column-mapping-hudi"></a>

Si desea realizar consultas de datos en formato de copia en escritura (Copy On Write, CoW) de Apache Hudi, puede emplear las tablas externas de Amazon Redshift Spectrum. Una tabla de copia en escritura de Hudi consiste en una colección de archivos Apache Parquet almacenados en Amazon S3. Puede leer tablas de copia al escribir (CoW) en las versiones 0.5.2, 0.6.0, 0.7.0, 0.8.0, 0.9.0, 0.10.0, 0.10.1, 0.11.0 y 0,11.1 de Apache Hudi que se crean y modifican con las operaciones de escritura insert, delete y upsert. Por ejemplo, no se admiten tablas de arranque. Para obtener más información, consulte [Tabla de copia en escritura](https://hudi.apache.org/docs/next/table_types#copy-on-write-table) en la documentación de Apache Hudi de código abierto. 

Cuando se crea una tabla externa que referencia datos en formato CoW de Hudi, se debe asignar cada columna de la tabla externa a una columna de los datos Hudi. La asignación se realiza por columna. 

Las instrucciones del lenguaje de definición de datos (DDL) para las tablas de Hudi con o sin partición se asemejan a las correspondientes a otros formatos de archivo Apache Parquet. En el caso de las tablas de Hudi, se define `INPUTFORMAT` como `org.apache.hudi.hadoop.HoodieParquetInputFormat`. El parámetro `LOCATION` debe apuntar a la carpeta base de la tabla de Hudi que contiene la carpeta `.hoodie`, la cual es necesaria para establecer la línea de tiempo de confirmación de Hudi. En algunos casos, una operación SELECT en una tabla de Hudi podría presentar un error y mostrar el mensaje No valid Hudi commit timeline found (No se encontró ninguna línea de tiempo de confirmación de Hudi válida). En ese caso, verifique si la carpeta `.hoodie` se encuentra en la ubicación correcta y contiene una línea de tiempo de confirmación de Hudi válida. 

**nota**  
El formato de Apache Hudi solo se admite cuando se utiliza un AWS Glue Data Catalog. No se admite cuando se utiliza un metastore de Apache Hive como el catálogo externo. 

El DDL que permite definir una tabla sin partición presenta el siguiente formato. 

```
CREATE EXTERNAL TABLE tbl_name (columns)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://s3-bucket/prefix'
```

El DDL que permite definir una tabla con partición presenta el siguiente formato. 

```
CREATE EXTERNAL TABLE tbl_name (columns)
PARTITIONED BY(pcolumn1 pcolumn1-type[,...])
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://s3-bucket/prefix'
```

Para agregar particiones a una tabla de Hudi con partición, ejecute un comando ALTER TABLE ADD PARTITION en el que el parámetro `LOCATION` apunte a la subcarpeta de Amazon S3 que contiene los archivos que pertenecen a la partición.

El DDL que permite agregar particiones presenta el siguiente formato.

```
ALTER TABLE tbl_name
ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...])
LOCATION 's3://s3-bucket/prefix/partition-path'
```

## Creación de tablas externas para datos administrados en Delta Lake
<a name="c-spectrum-column-mapping-delta"></a>

Si desea realizar consultas sobre los datos de las tablas de Delta Lake, puede utilizar las tablas externas de Amazon Redshift Spectrum. 

Si desea obtener acceso a una tabla de Delta Lake desde Redshift Spectrum, debe generar un manifiesto antes de realizar la consulta. Un *manifiesto* de Delta Lake contiene un listado de los archivos que conforman una instantánea consistente de la tabla de Delta Lake. En una tabla con partición, hay un manifiesto por cada partición. Una tabla de Delta Lake consiste en una colección de archivos Apache Parquet almacenados en Amazon S3. Para obtener más información, consulte [Delta Lake](https://delta.io) en la documentación de Delta Lake de código abierto. 

Cuando se crea una tabla externa que referencia los datos de las tablas de Delta Lake, se asigna cada columna de la tabla externa a una de las columnas de la tabla de Delta Lake. La asignación se realiza por nombre de columna. 

El DDL para las tablas con o sin partición de Delta Lake se asemeja al correspondiente a otros formatos de archivo Apache Parquet. En el caso de las tablas de Delta Lake, define `INPUTFORMAT` como `org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat` y `OUTPUTFORMAT` como `org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat`. El parámetro `LOCATION` debe apuntar a la carpeta del manifiesto en la carpeta base de la tabla. Si se produce un error en una operación SELECT de una tabla de Delta Lake, consulte para obtener información sobre los posibles motivos [Limitaciones y solución de problemas de las tablas de Delta Lake](#c-spectrum-column-mapping-delta-limitations). 

El DDL que permite definir una tabla sin partición presenta el siguiente formato. 

```
CREATE EXTERNAL TABLE tbl_name (columns)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest'
```

El DDL que permite definir una tabla con partición presenta el siguiente formato. 

```
CREATE EXTERNAL TABLE tbl_name (columns)
PARTITIONED BY(pcolumn1 pcolumn1-type[,...])
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://s3-bucket>/prefix/_symlink_format_manifest'
```

Si desea agregar particiones a una tabla de Delta Lake con partición, ejecute un comando ALTER TABLE ADD PARTITION en el que el parámetro `LOCATION` apunte a la subcarpeta de Amazon S3 que contiene el manifiesto de la partición.

El DDL que permite agregar particiones presenta el siguiente formato.

```
ALTER TABLE tbl_name
ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...])
LOCATION
's3://s3-bucket/prefix/_symlink_format_manifest/partition-path'
```

También puede ejecutar un DDL que apunte directamente al archivo de manifiesto de Delta Lake.

```
ALTER TABLE tbl_name
ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...])
LOCATION
's3://s3-bucket/prefix/_symlink_format_manifest/partition-path/manifest'
```

### Limitaciones y solución de problemas de las tablas de Delta Lake
<a name="c-spectrum-column-mapping-delta-limitations"></a>

Cuando consulte las tablas de Delta Lake desde Redshift Spectrum, tenga en cuenta lo siguiente:
+ Si un manifiesto apunta a una instantánea o una partición que ya no existe, se producen errores en las consultas hasta que se genere un nuevo manifiesto válido. Por ejemplo, esto podría suceder con una operación VACUUM en la tabla subyacente.
+ Los manifiestos de Delta Lake solo proporcionan consistencia en el nivel de la partición. 

En la siguiente tabla, se explican algunos de los posibles motivos por los cuales se producen ciertos errores cuando se consulta una tabla de Delta Lake. 


| Mensaje de error | Posible motivo | 
| --- | --- | 
| El manifiesto de Delta Lake en el bucket *s3-bucket-1* no puede contener entradas en el bucket *s3-bucket-2*. | Las entradas del manifiesto apuntan a archivos en un bucket de Amazon S3 distinto al especificado.  | 
| Se espera que los archivos de Delta Lake se encuentren en la misma carpeta. | Las entradas del manifiesto apuntan a archivos que poseen un prefijo de Amazon S3 distinto al especificado. | 
| No se ha encontrado el archivo *nombre del archivo* que aparece en el manifiesto *ruta de manifiesto* de Delta Lake. | No se encontró en Amazon S3 un archivo incluido en el manifiesto.  | 
| Se produjo un error en la recuperación del manifiesto de Delta Lake. | No se encontró el manifiesto en Amazon S3.  | 
| La ruta de S3 no es válida. | Una entrada en el archivo de manifiesto no constituye una ruta válida de Amazon S3, o bien, se ha dañado el archivo de manifiesto.  | 