INSERT INTO - Amazon Athena

INSERT INTO

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.

Condiciones y limitaciones

Cuando utilice las consultas INSERT con Athena, tenga en cuenta lo siguiente.

importante

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 consulta INSERT no se cifran. Le recomendamos que cifre los resultados de las consultas INSERT 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 Cifrado de los resultados de la consulta de Athena cuando se utiliza JDBC u ODBC. 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.

Formatos y SerDes admitidos

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

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

nota

Se admiten los archivos CSV, TSV y los que tienen delimitadores personalizados.

No se admiten tablas en buckets.

INSERT INTO no es compatible con las tablas en buckets. Para obtener más información, consulte Asignación de buckets y creación de particiones.

No se admiten consultas federadas

INSERT INTO no se admite para las consultas federadas. Si se intenta llevar a cabo esta operación, puede aparecer el mensaje de error This operation is currently not supported for external catalogs (Esta operación no se admite actualmente para catálogos externos). Para obtener información acerca de las consultas federadas, consulte Uso de consulta federada de Amazon Athena.

Partitioning

Considere los puntos de esta sección al utilizar particiones con consultas INSERT INTO o CREATE TABLE AS SELECT.

Limits

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 crear una tabla con más 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 destination_table SELECT * FROM source_table 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.

Resources

Para obtener más información acerca del uso de INSERT INTO con la partición, consulte los siguientes recursos.

Archivos escritos en 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.

Localización de archivos huérfanos

Si una instrucción CTAS o INSERT INTO produce un error, es posible que queden datos huérfanos en la ubicación de datos. Debido a que Athena no elimina ningún dato (incluso datos parciales) de su bucket, es posible que pueda leer estos datos parciales 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.

Synopsis

INSERT INTO destination_table SELECT select_query FROM source_table_or_view

Examples

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 city, seleccione los valores de las columnas state y cities_world 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 Trabajar con los resultados de las consultas, las consultas recientes y los archivos de salida.

Synopsis

INSERT INTO destination_table [(col1,col2,...)] VALUES (col1value,col2value,...)[, (col1value,col2value,...)][, ...]

Examples

En los siguientes ejemplos, la tabla de ciudades tiene varias columnas: , , y: id, city, state, 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')