Inserta filas nuevas en una tabla de destino en función de una instrucción de consulta SELECT
que se ejecuta en una tabla de origen o en función de un conjunto de VALUES
proporcionados como parte de la instrucción. Cuando la tabla de origen se basa en datos subyacentes con un formato concreto, como CSV o JSON, y la tabla de destino emplea otro formato, como Parquet u ORC, puede utilizar consultas INSERT INTO
para transformar los datos seleccionados en el formato de la tabla de destino.
Consideraciones y limitaciones
Cuando utilice las consultas INSERT
con Athena, tenga en cuenta lo siguiente.
-
De forma predeterminada, cuando se ejecuta una consulta
INSERT
en una tabla con datos subyacentes cifrados en Amazon S3, los archivos de salida que escribe la consultaINSERT
no se cifran. Le recomendamos que cifre los resultados de las consultasINSERT
si se van a insertar en tablas con datos cifrados.Para obtener más información acerca cómo cifrar los resultados de las consultas utilizando la consola, consulte Cifrado de los resultados de las consultas de Athena en Amazon S3. Para habilitar el cifrado mediante la AWS CLI o la API de Athena, utilice las propiedades
EncryptionConfiguration
de la acción StartQueryExecution para especificar las opciones de cifrado de Amazon S3 en función de sus necesidades. -
Para las instrucciones
INSERT INTO
, la configuración del propietario del bucket esperado no se aplica a la ubicación de la tabla de destino en Amazon S3. La configuración del propietario esperado del bucket se aplica solo a la ubicación de salida de Amazon S3 especificada para los resultados de las consultas de Athena. Para obtener más información, consulte Especificación de una ubicación de resultados de consulta mediante la consola de Athena. -
En relación con las instrucciones
INSERT INTO
que cumplen con los requisitos de ACID, consulte la secciónINSERT INTO
de Actualización de los datos de las tablas de Iceberg.
Formatos y SerDes compatibles
Puede ejecutar una consulta INSERT
en las tablas creadas a partir de datos con los siguientes formatos y SerDes.
Formato de los datos | 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 |
Archivo de texto |
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe notaSe admiten archivos TSV y con delimitadores personalizados. |
CSV | org.apache.hadoop.hive.serde2.OpenCSVSerdenotaLas escrituras solo son compatibles con tipos de datos de cadena. Desde Athena, no se puede escribir en tablas cuyo esquema de Glue contenga tipos de datos que no sean de cadena. Para obtener más información, consulte CSV SerDe. |
No se admiten tablas en buckets.
INSERT INTO
no es compatible con las tablas en buckets. Para obtener más información, consulte Uso de particiones y asignación de buckets.
Consultas federadas no compatibles
INSERT INTO
no es compatible con las consultas federadas. Si intenta hacerlo, puede aparecer el mensaje de error This operation is currently not supported for external catalogs
(Esta operación no es compatible actualmente con catálogos externos). Para obtener información sobre las consultas federadas, consulte Uso de consulta federada de Amazon Athena.
Particiones
Tenga en cuenta los puntos de esta sección al utilizar particiones con consultas INSERT
INTO
o CREATE TABLE AS SELECT
.
Límites
La instrucción INSERT INTO
admite escribir un máximo de 100 particiones en la tabla de destino. Si ejecuta la cláusula SELECT
en una tabla con más de 100 particiones, se produce un error en la consulta a menos que la consulta SELECT
esté limitada a 100 particiones o menos.
Para obtener más información sobre cómo evitar esta limitación, consulte Uso de CTAS e INSERT INTO para evitar el límite de 100 particiones.
Ordenamiento de columnas
Las instrucciones INSERT INTO
o CREATE TABLE AS SELECT
esperan que la columna particionada sea la última de la lista de columnas proyectadas en una instrucción SELECT
.
Si la tabla de origen no está particionada o está particionada en columnas diferentes en comparación con la tabla de destino, las consultas como INSERT INTO
consideran que los valores de la última columna de la tabla de origen son valores para una columna de partición en la tabla de destino. Tenga esto en cuenta al intentar crear una tabla particionada desde una tabla no particionada.destination_table
SELECT * FROM
source_table
Recursos
Para obtener más información acerca del uso de INSERT INTO
con la partición, consulte los siguientes recursos.
-
Para insertar datos particionados en una tabla particionada, consulte Uso de CTAS e INSERT INTO para evitar el límite de 100 particiones.
-
Para insertar datos no particionados en una tabla particionada, consulte Uso de CTAS e INSERT INTO en ETL y análisis de datos.
Archivos escritos en Simple Storage Service (Amazon S3)
Tras ejecutar el comando INSERT
, Athena escribe archivos en las ubicaciones de datos de origen de Amazon S3. Cada operación INSERT
crea un nuevo archivo, en lugar de anexar el resultado a un archivo existente. Las ubicaciones de los archivos dependen de la estructura de la tabla y la consulta SELECT
, si procede. Athena genera un archivo de manifiesto de datos para cada consulta INSERT
. El manifiesto realiza un seguimiento de los archivos que escribió la consulta. Se guarda en la ubicación del resultado de la consulta de Athena en Amazon S3. Para obtener más información, consulte Identificación de archivos de salida de consultas.
Evite las actualizaciones altamente transaccionales
Cuando utiliza INSERT INTO
para añadir filas a una tabla en Amazon S3, Athena no reescribe ni modifica los archivos existentes. En su lugar, escribe las filas como uno o más archivos nuevos. Dado que las tablas con muchos archivos pequeños reducen el rendimiento de las consultas y que las operaciones de escritura lectura, como PutObject
y GetObject
, generan costes más altos de Amazon S3, tenga en cuenta las siguientes opciones cuando utiliza INSERT INTO
:
-
Ejecute las operaciones
INSERT INTO
con menos frecuencia en lotes más grandes de filas. -
Para grandes volúmenes de ingesta de datos, considere la posibilidad de utilizar un servicio como Amazon Data Firehose.
-
Evite por completo el uso de
INSERT INTO
. En su lugar, acumule filas en archivos más grandes y cárguelos directamente en Amazon S3, donde Athena podrá consultarlos.
Localización de archivos huérfanos
Si una instrucción CTAS
o INSERT INTO
falla, los datos huérfanos se pueden dejar en la ubicación de los datos y se pueden leer en consultas posteriores. Para localizar archivos huérfanos para su inspección o eliminación, puede utilizar el archivo de manifiesto de datos que Athena proporciona para realizar un seguimiento de la lista de archivos que se van a escribir. Para obtener más información, consulte Identificación de archivos de salida de consultas y DataManifestLocation.
INSERT INTO...SELECT
Especifica la consulta que se va a ejecutar en una tabla, source_table
, lo que determina las filas que se van a insertar en una segunda tabla, destination_table
. Si la consulta SELECT
especifica columnas de source_table
, las columnas deben coincidir exactamente con las de destination_table
.
Para obtener más información acerca de las consultas SELECT
, consulte SELECT.
Sinopsis
INSERT INTO destination_table
SELECT select_query
FROM source_table_or_view
Ejemplos
Seleccione todas las filas de la tabla vancouver_pageviews
e insértelas en la tabla canada_pageviews
:
INSERT INTO canada_pageviews
SELECT *
FROM vancouver_pageviews;
Seleccione solo las filas de la tabla vancouver_pageviews
en las que la columna date
tiene un valor comprendido entre 2019-07-01
y 2019-07-31
. Después, insértelas en canada_july_pageviews
:
INSERT INTO canada_july_pageviews
SELECT *
FROM vancouver_pageviews
WHERE date
BETWEEN date '2019-07-01'
AND '2019-07-31';
En la tabla cities_world
, seleccione los valores de las columnas city
y state
de aquellas filas que tengan el valor usa
en la columna country
e insértelos en las columnas city
y state
de la tabla cities_usa
:
INSERT INTO cities_usa (city,state)
SELECT city,state
FROM cities_world
WHERE country='usa'
INSERT INTO...VALUES
Inserta filas en una tabla existente especificando columnas y valores. Las columnas especificadas y los tipos de datos asociados deben coincidir exactamente con las columnas y los tipos de datos de la tabla de destino.
importante
No es recomendable utilizar VALUES
para insertar las filas, ya que Athena genera archivos con cada operación INSERT
. Esto puede provocar que se creen muchos archivos pequeños y reducir el rendimiento de las consultas de la tabla. Para identificar los archivos que crea una consulta INSERT
, examine el archivo del manifiesto de datos. Para obtener más información, consulte Trabajo con resultados de la consulta y consultas recientes.
Sinopsis
INSERT INTO destination_table [(col1,col2,...)]
VALUES (col1value,col2value,...)[,
(col1value,col2value,...)][,
...]
Ejemplos
En los siguientes ejemplos, la tabla de ciudades tiene varias columnas: id
, city
, state
y state_motto
. La columna id
es de tipo INT
, mientras que todas las demás columnas son de tipo VARCHAR
.
Inserte una sola fila en la tabla cities
con todos los valores de columna especificados:
INSERT INTO cities
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
Inserte dos filas en la tabla cities
:
INSERT INTO cities
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'),
(3,'Boise','ID','Esto perpetua')