Creación de tablas externas para Redshift Spectrum - Amazon Redshift

Creación de tablas externas para 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 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 en la Guía para desarrolladores de AWS Glue, Introducción en la Guía del usuario de Amazon Athena, o bien, Apache Hive 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 Creación de esquemas externos para Amazon Redshift Spectrum.

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. 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 ( . , _, o #) o que finalizan con una tilde (~).

En el siguiente ejemplo, se crea una tabla denominada SALES en el esquema externo spectrum de Amazon Redshift. 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_EXTERNAL_TABLES.

Pseudocolumnas

‎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, consulte Ejemplo: Realización de subconsultas correlacionadas en Redshift Spectrum. Debe delimitar los nombres de las columnas $path, $size y $spectrum_oid con comillas dobles. Una cláusula SELECT * 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_enable_pseudo_columns. También puede desactivar solo la pseudocolumna $spectrum_oid configurando enable_spectrum_oid en false. Para obtener más información, consulte enable_spectrum_oid. 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.

Ejemplo de pseudocolumnas

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

Cuando particiona datos, puede restringir la cantidad de datos que Redshift Spectrum examina al filtrar mediante una clave de partición. Puede particionar 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 ( . , _, o #) o que finalizan con una tilde (~).

  2. 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.

  3. Agregue las particiones.

    Agregue cada una de las particiones con ALTER TABLE … 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

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

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_EXTERNAL_PARTITIONS.

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

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

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.

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:

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

Asignación por posición

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.

Nombre de columna de la tabla externa ID de columna ORC Nombre de columna ORC
int_col 1 int_col
float_col 2 float_col
nested_col 3 nested_col
nested_col.int_col 4 int_col
nested_col.map_col 5 map_col
nested_col.map_col.key 6 N/D
nested_col.map_col.value 7 N/D
nested_col.map_col.value.item 8 N/D

Asignación por nombre de columna

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.

Nombre de columna de la tabla externa ID de columna ORC Nombre de columna ORC
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

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

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 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

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 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 Limitaciones y solución de problemas de las tablas de Delta Lake para obtener información sobre los posibles motivos.

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

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.