Criar tabelas externas do Redshift Spectrum - Amazon Redshift

Criar tabelas externas do Redshift Spectrum

Crie uma tabela externa em um esquema externo. Para criar tabelas externas, você deve ser proprietário do esquema externo ou um superusuário. Para transferir a propriedade de um esquema externo, use ALTER SCHEMA para alterar o proprietário. O exemplo a seguir altera o proprietário do esquema spectrum_schema para newowner.

alter schema spectrum_schema owner to newowner;

Para executar uma consulta do Redshift Spectrum, você precisa das seguintes permissões:

  • Permissão de uso no esquema

  • Permissão para criar tabelas temporárias no banco de dados atual

O exemplo a seguir concede permissão de uso no esquema spectrum_schema para o grupo de usuários spectrumusers.

grant usage on schema spectrum_schema to group spectrumusers;

O exemplo a seguir concede permissão temporária no banco de dados spectrumdb para o grupo de usuários spectrumusers.

grant temp on database spectrumdb to group spectrumusers;

Você pode criar uma tabela externa no Amazon Redshift, AWS Glue, Amazon Athena ou em uma metastore do Apache Hive. Para obter mais informações, consulte Conceitos básicos do uso do AWS Glue no Guia do desenvolvedor do AWS Glue, Conceitos básicos no Manual do usuário do Amazon Athena ou Apache Hive no Guia do desenvolvedor do Amazon EMR.

Se sua tabela externa estiver definida no AWS Glue, no Athena ou em uma metastore do Hive, crie primeiro um esquema externo que faça referência ao banco de dados externo. Em seguida, inclua uma referência à tabela externa na instrução SELECT prefixando o nome da tabela com o nome do esquema, sem precisar criar a tabela no Amazon Redshift. Para obter mais informações, consulte Criação de esquemas externos do Amazon Redshift Spectrum.

Para permitir que o Amazon Redshift visualize tabelas no AWS Glue Data Catalog, adicione o glue:GetTable para a função do IAM do Amazon Redshift. Caso contrário, poderá ocorrer um erro semelhante ao seguinte.

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

Por exemplo, suponha que você tem uma tabela externa denominada lineitem_athena definida em um catálogo externo do Athena. Nesse caso, você pode definir um esquema externo denominado athena_schema e, em seguida, consultar a tabela usando o comando SELECT a seguir.

select count(*) from athena_schema.lineitem_athena;

Para definir uma tabela externa no Amazon Redshift, use o comando CREATE EXTERNAL TABLE. A instrução da tabela externa define as colunas da tabela, o formato dos arquivos de dados e a localização dos dados no Amazon S3. O Redshift Spectrum faz uma varredura dos arquivos na pasta especificada e em todas as subpastas. O Redshift Spectrum ignora os arquivos ocultos e os arquivos que começam com um ponto, um sublinhado ou um símbolo do jogo da velha (. , _, ou #) ou terminam com um til (~).

O exemplo a seguir cria uma tabela chamada SALES no esquema externo do Amazon Redshift denominado spectrum. Os dados estão em arquivos de texto delimitados por tabulação.

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 visualizar as tabelas externas, consulte a exibição do sistema SVV_EXTERNAL_TABLES.

Pseudocolunas

Por padrão, o Amazon Redshift cria tabelas externas com as pseudocolunas $path, $size e $spectrum_oid. Selecione a coluna $path para exibir o caminho para os arquivos de dados no Amazon S3 e selecione a coluna $size para exibir o tamanho dos arquivos de dados em cada linha retornada por uma consulta. A coluna $spectrum_oid possibilita realizar consultas correlacionadas com o Redshift Spectrum. Para ver um exemplo, consulte Exemplo: Executar subconsultas correlacionadas no Redshift Spectrum. Você precisa delimitar os nomes de colunas $path, $size e $spectrum_oid com aspas duplas. A cláusula SELECT * não retornará as pseudocolunas. Você deve incluir explicitamente os nomes de coluna $path, $size e $spectrum_oid na consulta, como mostra o exemplo a seguir.

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

Você pode desabilitar a criação de pseudocolunas em uma sessão. Basta definir o parâmetro de configuração spectrum_enable_pseudo_columns como false. Para obter mais informações, consulte spectrum_enable_pseudo_columns. Você também pode desabilitar somente a pseudocoluna $spectrum_oid definindo o parâmetro enable_spectrum_oid como false. Para obter mais informações, consulte enable_spectrum_oid. No entanto, desabilitar a pseudocoluna $spectrum_oid também desabilita a compatibilidade de consultas correlacionadas com o Redshift Spectrum.

Importante

A seleção de $size, $path ou $spectrum_oid gera cobranças porque o Redshift Spectrum verifica os arquivos de dados no Amazon S3 para determinar o tamanho do conjunto de resultados. Para obter mais informações, consulte Preço do Amazon Redshift.

Exemplo de pseudocolunas

O exemplo a seguir retorna o tamanho total de arquivos de dados relacionados de uma tabela 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

Dividir as tabelas externas do Redshift Spectrum

Ao dividir seus dados em partições, você pode restringir a quantidade de varreduras de dados do Redshift Spectrum filtrando pela chave de partição. Você pode dividir seus dados em partições usando qualquer chave.

Uma prática comum é dividir os dados com base no tempo. Por exemplo, você pode escolher a partição por ano, mês, data e hora. Se você tiver dados vindos de várias origens, pode dividi-los em partições por um identificador de origem dos dados e por data.

O procedimento a seguir descreve como dividir os dados em partições.

Para dividir seus dados em partições
  1. Armazene os dados em pastas no Amazon S3 de acordo com sua chave de partição.

    Crie uma pasta para cada valor de partição e nomeie a pasta com a chave e o valor da partição. Por exemplo, se você dividir por data, pode ter pastas denominadas saledate=2017-04-01, saledate=2017-04-02, e assim por diante. O Redshift Spectrum faz uma varredura dos arquivos na pasta da partição e em todas as subpastas. O Redshift Spectrum ignora os arquivos ocultos e os arquivos que começam com um ponto, um sublinhado ou um símbolo do jogo da velha (. , _, ou #) ou terminam com um til (~).

  2. Crie uma tabela externa e especifique a chave de partição na cláusula PARTITIONED BY.

    A chave de partição não pode ser o nome de uma coluna da tabela. O tipo dos dados pode ser SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE ou TIMESTAMP.

  3. Adicione as partições.

    Usando o ALTER TABLE … ADD PARTITION, adicione cada partição especificando a coluna e a chave-valor de partição, além do local da pasta de partição no Amazon S3. Você pode adicionar várias partições em um único comando ALTER TABLE… ADD. O exemplo a seguir inclui partições para '2008-01' e '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

    Se usar o catálogo do AWS Glue, você poderá adicionar até 100 partições usando um único comando ALTER TABLE.

Exemplos de particionamento de dados

Neste exemplo, você cria uma tabela externa que é particionada por uma única chave de partição e uma tabela externa que é particionada por duas chaves de partição.

Os dados deste exemplo estão localizados em um bucket do Amazon S3 que oferece acesso de leitura a todos os usuários autenticados da AWS. O cluster e os arquivos de dados externos devem estar localizados na mesma Região da AWS. O bucket de dados de exemplo está na região Leste dos EUA (Norte da Virgínia) (us-east-1). Para acessar os dados usando o Redshift Spectrum, seu cluster também deve estar em us-east-1. Para listar as pastas no Amazon S3, execute o comando a seguir.

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/

Se você ainda não tiver um esquema externo, execute o seguinte comando. Substitua o nome de recurso da Amazon (ARN) para a sua função do 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;

Exemplo 1: particionamento com uma única chave de partição

No exemplo a seguir, você cria uma tabela externa que é particionada pelo mês.

Para criar uma tabela externa particionada pelo mês, execute o seguinte 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 adicionar as partições, execute o seguinte 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 selecionar dados na tabela particionada, execute a consulta a seguir.

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 visualizar as partições da tabela externa, consulte a exibição do 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

Exemplo 2: particionamento com várias chaves de partição

Para criar uma tabela externa particionada por date e por eventid, execute o seguinte 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 adicionar as partições, execute o seguinte 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/';

Execute a consulta a seguir para selecionar os dados da tabela 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

Mapeamento de colunas de tabela externa para colunas do ORC

Você usa tabelas externas do Amazon Redshift Spectrum para consultar dados de arquivos no formato ORC. O formato de coluna de linha otimizada (ORC) é um formato de arquivo de armazenamento colunar que oferece suporte para estruturas de dados aninhadas. Para obter mais informações sobre como consultar dados aninhados, consulte Consultar dados aninhados com o Amazon Redshift Spectrum.

Ao criar uma tabela externa que faz referência a dados em um arquivo ORC, você mapeia cada coluna na tabela externa para uma coluna nos dados ORC. Para fazer isso, você usa um dos seguintes métodos:

O mapeamento por nome de coluna é o padrão.

Mapeamento por posição

Com o mapeamento por posição, a primeira coluna definida na tabela externa é mapeada para a primeira coluna no arquivo de dados ORC, a segundo para a segundo e assim por diante. O mapeamento por posição requer que a ordem das colunas na tabela externa e no arquivo ORC corresponda. Se a ordem das colunas não corresponder, você poderá mapear as colunas por nome.

Importante

Em releases anteriores, o Redshift Spectrum usava o mapeamento de posição por padrão. Se você precisar continuar usando o mapeamento por posição para tabelas existentes, defina a propriedade de tabela orc.schema.resolution como position, como mostra o exemplo a seguir.

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

Por exemplo, a tabela SPECTRUM.ORC_EXAMPLE é definida da seguinte maneira.

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/';

A estrutura da tabela pode ser abstraída como segue.

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

O arquivo ORC subjacente tem a seguinte estrutura de arquivos.

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

Neste exemplo, você pode mapear cada coluna na tabela externa para uma coluna no arquivo ORC estritamente por posição. Veja o mapeamento a seguir.

Nome da coluna de tabela externa ID de coluna ORC Nome da coluna 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

Mapeamento por nome de coluna

Usando o mapeamento de nomes, você mapeia colunas em uma tabela externa para colunas nomeadas em arquivos ORC no mesmo nível, com o mesmo nome.

Por exemplo, suponha que você queira mapear a tabela do exemplo anterior, SPECTRUM.ORC_EXAMPLE, com um arquivo ORC que usa a seguinte estrutura de arquivo.

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

Usando mapeamento por posição, o Redshift Spectrum tenta o seguinte mapeamento.

Nome da coluna de tabela externa ID de coluna ORC Nome da coluna ORC
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

Quando você consulta uma tabela com o mapeamento de posição anterior, o comando SELECT falha na validação de tipo, pois as estruturas são diferentes.

Você pode mapear a mesma tabela externa para ambas as estruturas de arquivo mostradas nos exemplos anteriores usando o mapeamento por nome de coluna. As colunas da tabela int_col, float_col e nested_col são mapeadas por nome de coluna para colunas com os mesmos nomes no arquivo ORC. A coluna denominada nested_col na tabela externa é uma coluna struct com subcolunas denominadas map_col e int_col. As subcolunas também são mapeadas corretamente para as colunas correspondentes no arquivo ORC por nome da coluna.

Criar tabelas externas para dados gerenciados no Apache Hudi

Para consultar dados no formato Apache Hudi Copy On Write (CoW), use tabelas externas do Amazon Redshift Spectrum. Uma tabela do Delta Lake é uma coleção de arquivos do Apache Parquet armazenados no Amazon S3. É possível ler tabelas de cópia em gravação (CoW) nas versões 0.5.2, 0.6.0, 0.7.0, 0.8.0, 0.9.0, 0.10.0, 0.10.1, 0.11.0 e 0.11.1 do Apache Hudi que são criadas e modificadas com operações de gravação insert, delete e upsert. Por exemplo, tabelas de bootstrap não são compatíveis. Para obter mais informações, consulte Tabela do Copy On Write na documentação de código aberto do Apache Hudi.

Ao criar uma tabela externa que faz referência a dados em um formato Hudi CoW, você mapeia cada coluna na tabela externa para uma coluna nos dados do Hudi. O mapeamento é feito por coluna.

As instruções de linguagem de definição de dados (DDL) para tabelas particionadas e não particionadas do Hudi são semelhantes às de outros formatos de arquivo do Apache Parquet. Para tabelas do Hudi, defina INPUTFORMAT como org.apache.hudi.hadoop.HoodieParquetInputFormat. O parâmetro LOCATION deve apontar para a pasta base da tabela do Hudi que contém a pasta .hoodie, necessária para estabelecer a linha do tempo de confirmação do Hudi. Em alguns casos, uma operação SELECT em uma tabela do Hudi pode falhar, exibindo a mensagem Nenhuma linha de tempo de confirmação válida do Hudi foi encontrada. Se for o caso, verifique se a pasta .hoodie está no local correto e contém uma linha de tempo de confirmação do Hudi válida.

nota

O formato Apache Hudi só é compatível quando você usa um AWS Glue Data Catalog. Ele não é compatível quando você usa uma metastore do Apache Hive como o catálogo externo.

O DDL para definir uma tabela não particionada tem o formato a seguir.

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'

O DDL para definir uma tabela particionada tem o formato a seguir.

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 adicionar partições a uma tabela do Hudi particionada, execute um comando ALTER TABLE ADD PARTITION, no qual o parâmetro LOCATION aponta para a subpasta do Amazon S3 com os arquivos que pertencem à partição.

O DDL para adicionar partições tem o formato a seguir.

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

Criar tabelas externas para dados gerenciados no Delta Lake

Para consultar dados em tabelas do Delta Lake, você pode usar tabelas externas do Amazon Redshift Spectrum.

Para acessar uma tabela do Delta Lake a partir do Redshift Spectrum, gere um manifesto antes da consulta. Um manifesto do Delta Lake contém uma lista de arquivos que compõem um snapshot consistente da tabela do Delta Lake. Em uma tabela particionada, há um manifesto por partição. Uma tabela do Delta Lake é uma coleção de arquivos do Apache Parquet armazenados no Amazon S3. Para obter mais informações, consulte Delta Lake na documentação de código aberto do Delta Lake.

Ao criar uma tabela externa que faz referência a dados em tabelas do Delta Lake, você mapeia cada coluna na tabela externa para uma coluna na tabela do Delta Lake. O mapeamento é feito pelo nome da coluna.

O DDL para tabelas particionadas e não particionadas do Delta Lake é semelhante ao dos outros formatos de arquivo do Apache Parquet. Para tabelas do Delta Lake, defina INPUTFORMAT como org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat e OUTPUTFORMAT como org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat. O LOCATION deve apontar para a pasta de manifesto na pasta base da tabela. Se uma operação SELECT em uma tabela do Delta Lake falhar, consulte Limitações e solução de problemas para tabelas do Delta Lake para obter os possíveis motivos.

O DDL para definir uma tabela não particionada tem o formato a seguir.

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'

O DDL para definir uma tabela particionada tem o formato a seguir.

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'

Para adicionar partições a uma tabela particionada do Delta Lake, execute um comando ALTER TABLE ADD PARTITION no qual o parâmetro LOCATION aponte para a subpasta do Amazon S3 que contém o manifesto para a partição.

O DDL para adicionar partições tem o formato a seguir.

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

Ou execute o DDL que aponte diretamente para o arquivo manifesto do Delta Lake.

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

Limitações e solução de problemas para tabelas do Delta Lake

Considere o seguinte ao consultar tabelas do Delta Lake do Redshift Spectrum:

  • Se um manifesto apontar para um snapshot ou partição que não existe mais, as consultas falharão até que um novo manifesto válido seja gerado. Por exemplo, isso pode resultar de uma operação VACUUM na tabela subjacente,

  • Os manifestos do Delta Lake fornecem apenas consistência em nível de partição.

A tabela a seguir explica alguns potenciais motivos para determinados erros quando você consulta uma tabela do Delta Lake.

Mensagem de erro Possível motivo

O manifesto do Delta Lake no bucket s3-bucket-1 não pode conter entradas no bucket s3-bucket-2.

As entradas de manifesto apontam para arquivos em um bucket do Amazon S3 diferente do especificado.

Os arquivos do Delta Lake devem estar na mesma pasta.

As entradas de manifesto apontam para arquivos que têm um prefixo do Amazon S3 diferente do especificado.

Não foi possível encontrar o arquivo filename listado no manifesto do Delta Lake manifest-path.

Um arquivo listado no manifesto não foi encontrado no Amazon S3.

Erro ao buscar o manifesto do Delta Lake.

O manifesto não foi encontrado no Amazon S3.

Caminho do S3 inválido.

Uma entrada no arquivo manifesto não é um caminho válido do Amazon S3 ou o arquivo manifesto foi corrompido.