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.

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

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 Creación de buckets y división en particiones .

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

Considere 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 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.

Recursos

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

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 .

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.

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 las consultas, consultas recientes y archivos de salida .

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')