INSERT INTO
Insere novas linhas em uma tabela de destino com base em uma instrução de consulta SELECT
executada em uma tabela de origem ou com base em um conjunto de VALUES
fornecidos como parte da instrução. Quando a tabela de origem é baseada em dados subjacentes em um formato, como CSV ou JSON, e a tabela de destino é baseada em outro formato, como Parquet ou ORC, você pode usar as consultas INSERT INTO
para transformar os dados selecionados no formato da tabela de destino.
Considerações e limitações
Considere o seguinte ao usar as consultas INSERT
com o Athena.
-
Ao executar uma consulta
INSERT
em uma tabela com dados subjacentes criptografados no Amazon S3, os arquivos de saída que a consultaINSERT
grava não são criptografados por padrão. Recomendamos que você criptografe os resultados da consultaINSERT
se estiver inserindo em tabelas com dados criptografados.Para obter mais informações sobre como criptografar resultados da consulta usando o console, consulte Criptografar os resultados de consultas do Athena armazenados no Amazon S3. Para habilitar a criptografia usando a AWS CLI ou a API do Athena, use as propriedades
EncryptionConfiguration
da ação StartQueryExecution para especificar as opções de criptografia do Amazon S3 de acordo com os seus requisitos. -
Para instruções
INSERT INTO
, a configuração do proprietário do bucket esperado não se aplica ao local da tabela de destino no Amazon S3. A configuração esperada do proprietário do bucket se aplica somente ao local de saída do Amazon S3 que você especificar para os resultados da consulta do Athena. Para ter mais informações, consulte Especificar um local para resultados de consultas com uso do console do Athena. -
Para obter instruções
INSERT INTO
em conformidade com ACID, consulte a seçãoINSERT INTO
em Atualizar dados nas tabelas do Iceberg.
Formatos compatíveis e SerDes
É possível executar uma consulta INSERT
em tabelas criadas de dados com os seguintes formatos e SerDes.
Formato de dados | SerDe |
---|---|
Avro |
org.apache.hadoop.hive.serde2.avro.AvroSerDe |
Ion | com.amazon.ionhiveserde.IonHiveSerDe |
JSON |
org.apache.hive.hcatalog.data.JsonSerDe |
ORC |
org.apache.hadoop.hive.ql.io.orc.OrcSerde |
Parquet |
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe |
Arquivo de texto |
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe notaArquivos CSV, TSV e delimitados personalizados são compatíveis. |
Tabelas em bucket sem suporte
INSERT INTO
não é compatível com tabelas em bucket. Para ter mais informações, consulte Usar particionamento e bucketing.
Consultas federadas sem suporte
INSERT INTO
não é suportado para consultas federadas. Tentar fazer isso pode gerar a mensagem de erro: This operation is currently not supported for external catalogs
(Atualmente, esta operação não é suportada para catálogos externos). Para obter informações sobre consultas federadas, consulte Usar a consulta federada do Amazon Athena.
Particionamento
Considere os pontos desta seção ao usar o particionamento com as consultas INSERT
INTO
ou CREATE TABLE AS SELECT
.
Limites
A instrução INSERT INTO
comporta a gravação de no máximo 100 combinações de partições na tabela de destino. Se você executar a cláusula SELECT
em uma tabela com mais de 100 partições, a consulta falhará a menos que a consulta SELECT
seja limitada a 100 partições ou menos.
Para obter informações sobre como contornar essa limitação, consulte Usar CTAS e INSERT INTO para resolver o limite de 100 partições.
Ordem das colunas
As instruções INSERT INTO
ou CREATE TABLE AS SELECT
esperam que a coluna particionada seja a última na lista de colunas projetadas em uma instrução SELECT
.
Se a tabela de origem não for particionada ou for particionada em colunas diferentes em comparação com a tabela de destino, as consultas como INSERT INTO
vão considerar os valores na última coluna da tabela de origem como os valores de uma coluna de partição na tabela de destino. Tenha isso em mente ao tentar criar uma tabela particionada com base em uma tabela não particionada.destination_table
SELECT * FROM
source_table
Recursos
Para obter mais informações sobre como usar INSERT INTO
com particionamento, consulte os recursos abaixo.
-
Para inserir dados particionados em uma tabela particionada, consulte Usar CTAS e INSERT INTO para resolver o limite de 100 partições.
-
Para inserir dados não particionados em uma tabela particionada, consulte Usar CTAS e INSERT INTO para ETL e análise de dados.
Arquivos gravados no Amazon S3
O Athena grava arquivos nos locais dos dados de origem no Amazon S3 como resultado do comando INSERT
. Cada operação INSERT
cria um novo arquivo, em vez de anexar a um arquivo existente. Os locais de arquivos dependem da estrutura da tabela e da consulta SELECT
, se houver. O Athena gera um arquivo manifesto de dados para cada consulta INSERT
. O manifesto rastreia os arquivos que a consulta gravou. Ele é salvo no local dos resultados das consultas do Athena no Amazon S3. Para ter mais informações, consulte Identificar arquivos de saída de consultas.
Evitar atualizações altamente transacionais
Quando você usa INSERT INTO
para adicionar linhas a uma tabela no Amazon S3, o Athena não reescreve nem modifica arquivos existentes. Em vez disso, ele grava as linhas como um ou mais novos arquivos. Como tabelas com muitos arquivos pequenos resultam em desempenho inferior de consultas, e operações de gravação e leitura, como PutObject
e GetObject
, resultam em custos mais altos no Amazon S3, considere as seguintes opções ao usar INSERT INTO
:
-
Execute operações
INSERT INTO
com menor frequência em lotes maiores de linhas. -
Para grandes volumes de ingestão de dados, considere usar um serviço como o Amazon Data Firehose.
-
Evite completamente o uso de
INSERT INTO
. Em vez disso, acumule linhas em arquivos maiores e faça o upload deles diretamente para o Amazon S3, onde poderão ser consultados pelo Athena.
Localizar arquivos órfãos
Se uma instrução INSERT INTO
ou CTAS
falhar, os dados órfãos poderão ser deixados no local de dados e ser lidos em consultas subsequentes. Para localizar arquivos órfãos para inspeção ou exclusão, é possível usar o arquivo do manifesto de dados que o Athena oferece para rastrear a lista de arquivos a serem gravados. Para obter mais informações, consulte Identificar arquivos de saída de consultas e DataManifestLocation.
INSERT INTO...SELECT
Especifica a consulta a ser executada em uma tabela, source_table
, que determina as linhas a serem inseridas em uma segunda tabela, destination_table
. Se a consulta SELECT
especificar colunas na source_table
, as colunas deverão corresponder precisamente àquelas na destination_table
.
Para obter mais informações sobre consultas SELECT
, consulte SELECT.
Resumo
INSERT INTO destination_table
SELECT select_query
FROM source_table_or_view
Exemplos
Selecione todas as linhas na tabela vancouver_pageviews
e insira-as na tabela canada_pageviews
:
INSERT INTO canada_pageviews SELECT * FROM vancouver_pageviews;
Selecione apenas as linhas na tabela vancouver_pageviews
em que a coluna date
tenha um valor entre 2019-07-01
e 2019-07-31
, e insira-as em canada_july_pageviews
:
INSERT INTO canada_july_pageviews SELECT * FROM vancouver_pageviews WHERE date BETWEEN date '2019-07-01' AND '2019-07-31';
Selecione os valores nas colunas city
e state
na tabela cities_world
somente dessas linhas com um valor usa
na coluna country
e insira-os nas colunas city
e state
na tabela cities_usa
:
INSERT INTO cities_usa (city,state) SELECT city,state FROM cities_world WHERE country='usa'
INSERT INTO...VALUES
Insere linhas em uma tabela existente especificando colunas e valores. As colunas especificadas e os tipos de dados associados devem corresponder precisamente às colunas e aos tipos de dados na tabela de destino.
Importante
Não recomendamos inserir linhas com VALUES
porque o Athena gera arquivos para cada operação INSERT
. Isso pode fazer com que muitos arquivos pequenos sejam criados e degradem a performance de consulta da tabela. Para identificar arquivos que uma consulta INSERT
cria, examine o arquivo manifesto de dados. Para ter mais informações, consulte Trabalhar com resultados de consultas e consultas recentes.
Resumo
INSERT INTO destination_table [(col1,col2,...)]
VALUES (col1value,col2value,...)[,
(col1value,col2value,...)][,
...]
Exemplos
Nos exemplos a seguir, a tabela de cidades tem três colunas: id
, city
, state
, state_motto
. A coluna id
é do tipo INT
, e todas as outras colunas são do tipo VARCHAR
.
Insira uma única linha na tabela cities
, com todos os valores da coluna especificados:
INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
Insira duas linhas na tabela cities
:
INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'), (3,'Boise','ID','Esto perpetua')