INSERT (tabela externa) - Amazon Redshift

INSERT (tabela externa)

Insere o resultado de uma consulta SELECT em tabelas externas ou catálogos externos existentes, como o AWS Glue, o AWS Lake Formation ou um metastore do Apache Hive. Use a mesma função do AWS Identity and Access Management (IAM) usada para o comando CREATE EXTERNAL SCHEMA para interagir com catálogos externos e com o Amazon S3.

Para tabelas não particionadas, o comando INSERT (tabela externa) grava dados no local do Amazon S3 definido na tabela, com base nas propriedades de tabela e no formato de arquivo especificados.

Para tabelas particionadas, INSERT (tabela externa) grava dados no local do Amazon S3 de acordo com a chave de partição especificada na tabela. Ele também registra novas partições no catálogo externo após a operação INSERT ser concluída.

Não é possível executar INSERT (tabela externa) em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte Isolamento serializável.

Sintaxe

INSERT INTO external_schema.table_name { select_statement }

Parâmetros

external_schema.table_name

O nome de um esquema externo existente e uma tabela externa de destino na qual será inserido.

select_statement

Uma instrução que insere uma ou mais linhas na tabela externa ao definir qualquer consulta. Todas as linhas que a consulta gera são gravadas no Amazon S3 no formato de texto ou Parquet com base na definição da tabela. A consulta deve retornar uma lista de colunas que seja compatível com os tipos de dados da coluna na tabela externa. No entanto, os nomes das colunas não precisam corresponder.

Observações de uso

O número de colunas na consulta SELECT deve ser igual à soma de colunas de dados e de colunas de partição. O local e o tipo de dados de cada coluna de dados deve corresponder àqueles da tabela externa. O local das colunas de partição devem estar no final da consulta SELECT, na mesma ordem definida no comando CREATE EXTERNAL TABLE. Os nomes das colunas não precisam corresponder.

Em alguns casos, talvez você queira executar o comando INSERT (tabela externa) em um catálogo de dados do AWS Glue ou um metastore do Hive. No caso do AWS Glue, a função do IAM usada para criar o esquema externo deve ter as permissões de leitura e gravação no Amazon S3 e no AWS Glue. Se você usar um catálogo do AWS Lake Formation, essa função do IAM se tornará a proprietária da nova tabela do Lake Formation. Essa função do IAM deve ter pelo menos as seguintes permissões:

  • Permissão SELECT, INSERT, UPDATE na tabela externa

  • Permissão do local dos dados no caminho do Amazon S3 da tabela externa

Para garantir que os nomes dos arquivos sejam únicos, o Amazon Redshift usa o seguinte formato para o nome de cada arquivo carregado no Amazon S3 por padrão.

<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>.

Um exemplo é 20200303_004509_810669_1007_0001_part_00.parquet.

Considere o seguinte ao executar o comando INSERT (tabela externa):

  • Não há suporte para tabelas externas com formato diferente de PARQUET ou TEXTFILE.

  • Este comando oferece suporte às propriedades de tabela existentes, como 'write.parallel', 'write.maxfilesize.mb', 'compression_type’ e 'serialization.null.format'. Para atualizar esses valores, execute o comando ALTER TABLE SET TABLE PROPERTIES.

  • A propriedade de tabela 'numRows’ é automaticamente atualizada no final da operação INSERT. A propriedade da tabela deve estar definida ou ter sido adicionada à tabela, caso ela não tenha sido criada pela operação CREATE EXTERNAL TABLE AS.

  • Não há suporte para a cláusula LIMIT na consulta SELECT externa. Em vez disso, use uma cláusula LIMIT aninhada.

  • É possível usar a tabela STL_UNLOAD_LOG para rastrear os arquivos que foram gravados no Amazon S3 por cada operação INSERT (tabela externa).

  • O Amazon Redshift suporta somente a criptografia padrão do Amazon S3 para INSERT (tabela externa).

Exemplos de INSERT (tabela externa)

O exemplo a seguir insere os resultados da instrução SELECT na tabela externa.

INSERT INTO spectrum.lineitem SELECT * FROM local_lineitem;

O exemplo a seguir insere os resultados da instrução SELECT em uma tabela externa particionada usando o particionamento estático. As colunas de partição são codificadas na instrução SELECT. As colunas de partição devem estar no final da consulta.

INSERT INTO spectrum.customer SELECT name, age, gender, 'May', 28 FROM local_customer;

O exemplo a seguir insere os resultados da instrução SELECT em uma tabela externa particionada usando o particionamento dinâmico. As colunas de partição não são codificadas. Os dados são adicionados automaticamente às pastas de partição existentes ou a novas pastas se uma nova partição for adicionada.

INSERT INTO spectrum.customer SELECT name, age, gender, month, day FROM local_customer;