INSERT INTO - Amazon Athena

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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.

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 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. Para habilitar el cifrado mediante la API AWS CLI o Athena, utilice las EncryptionConfiguration propiedades de la StartQueryExecutionacción para especificar las opciones de cifrado de Amazon S3 según sus requisitos.

  • 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ón INSERT INTO de Actualización de los datos de las tablas de Iceberg.

Formatos compatibles y SerDes

Puede ejecutar una INSERT consulta en 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.ionhiveser.de. 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

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

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

Evite las actualizaciones altamente transaccionales

Cuando se añaden filas INSERT INTO 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 PutObject y GetObject lectura, como Amazon S3, generan costes más altos, tenga en cuenta las siguientes opciones al utilizarlasINSERT INTO:

  • Ejecute INSERT INTO las operaciones con menos frecuencia en lotes de filas más grandes.

  • Para grandes volúmenes de ingesta de datos, considere la posibilidad de utilizar un servicio como Amazon Data Firehose.

  • Evite su uso INSERT INTO por completo. 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 INSERT INTO o CTAS 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')