Tabelas externas para o Redshift Spectrum
Este tópico descreve como criar e usar tabelas externas com o Redshift Spectrum. Tabelas externos são coleções de tabelas que você usa como referência para acessar dados fora do cluster do Amazon Redshift. Essas tabelas contêm metadados sobre os dados externos que o Redshift Spectrum lê.
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 Esquemas externos no 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
-
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 (~). -
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.
-
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
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
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 |
---|---|
|
As entradas de manifesto apontam para arquivos em um bucket do Amazon S3 diferente do especificado. |
|
As entradas de manifesto apontam para arquivos que têm um prefixo do Amazon S3 diferente do especificado. |
|
Um arquivo listado no manifesto não foi encontrado no Amazon S3. |
|
O manifesto não foi encontrado no Amazon S3. |
|
Uma entrada no arquivo manifesto não é um caminho válido do Amazon S3 ou o arquivo manifesto foi corrompido. |