INSERT INTO - Amazon Athena

INSERT INTO

Insère de nouvelles lignes dans une table de destination en fonction d'une instruction de requête SELECT qui s'exécute sur une table source, ou en fonction d'un ensemble de VALUES fourni dans le cadre de l'instruction. Lorsque la table source est basée sur des données sous-jacentes dans un format tel que CSV ou JSON, et que la table de destination est basée sur un autre format, comme Parquet ou ORC, vous pouvez utiliser les requêtes INSERT INTO pour transformer les données sélectionnées au format de la table de destination.

Considérations et restrictions

Tenez compte des points suivants lorsque vous utilisez des requêtes INSERT avec Athena.

  • Lors de l'exécution d'une requête INSERT sur une table avec des données sous-jacentes chiffrées dans Simple Storage Service (Amazon S3), les fichiers de sortie écrit par la requête INSERT ne sont pas chiffrés par défaut. Nous vous recommandons de chiffrer les résultats de la requête INSERT si vous les insérez dans des tables avec des données chiffrées.

    Pour plus d'informations sur le chiffrement des résultats de requête à l'aide de la console, consultez Chiffrement des résultats de requêtes Athena stockés dans Amazon S3. Pour activer le chiffrement à l'aide de l'AWS CLI ou de l'API Athena, utilisez les propriétés EncryptionConfiguration de l'action StartQueryExecution pour spécifier les options de chiffrement Simple Storage Service (Amazon S3) en fonction de vos besoins.

  • Pour les instructions INSERT INTO, le paramètre de propriétaire du compartiment attendu ne s'applique pas à l'emplacement de la table de destination dans Simple Storage Service (Amazon S3). Le paramètre de propriétaire du compartiment attendu s'applique uniquement à l'emplacement de sortie Simple Storage Service (Amazon S3) que vous spécifiez pour les résultats de la requête Athena. Pour de plus amples informations, consultez Spécification d’un emplacement de résultats des requêtes à l’aide de la console Athena.

  • Pour les instructions INSERT INTO conformes à la norme ACID, voir la rubrique INSERT INTO de Mise à jour des données de tables Iceberg.

Formats et SerDe pris en charge

Vous pouvez exécuter une requête INSERT sur des tables créées à partir de données avec les formats et SerDe suivants.

Format de données 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

Fichier texte

org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

Note

Les fichiers TSV et les fichiers avec séparateur personnalisé sont pris en charge.

CSV org.apache.hadoop.hive.serde2.OpenCSVSerde
Note

L’écriture est uniquement prise en charge dans le cadre de types qui sont des chaînes. Depuis Athena, vous ne pouvez pas écrire dans des tables contenant des types qui ne sont pas des chaînes au sein d’un schéma Glue. Pour plus d’informations, consultez la section sur le SerDe CSV.

Tables compartimentées non prises en charge

INSERT INTO n'est pas pris en charge sur les tables compartimentées. Pour de plus amples informations, consultez Utilisation du partitionnement et de la compartimentation.

Requêtes fédérées non prises en charge

INSERT INTO n'est pas supporté pour les requêtes fédérées. Si vous tentez de le faire, le message d'erreur suivant peut s'afficher : This operation is currently not supported for external catalogs (Cette opération n'est actuellement pas prise en charge pour les catalogues externes). Pour plus d'informations sur les requêtes fédérées, consultez Utilisation de la requête fédérée Amazon Athena.

Partitioning

Tenez compte des points de cette section lorsque vous utilisez le partitionnement avec des requêtes INSERT INTO ou CREATE TABLE AS SELECT.

Limites

L'instruction INSERT INTO prend en charge l'écriture de 100 partitions au maximum dans la table de destination. Si vous exécutez la clause SELECT sur une table avec plus de 100 partitions, la requête échoue sauf si la requête SELECT est limitée à 100 partitions ou moins.

Pour plus d'informations sur le contournement de cette limitation, consultez Utilisation de CTAS et INSERT INTO pour contourner la limite de 100 partitions.

Ordre des colonnes

Les instructions INSERT INTO ou CREATE TABLE AS SELECT s'attendent à ce que la colonne partitionnée soit la dernière colonne de la liste des colonnes projetées dans une instruction SELECT.

Si la table source n'est pas partitionnée, ou si elle est partitionnée sur différentes colonnes par rapport à la table de destination, les requêtes comme INSERT INTO destination_table SELECT * FROM source_table considèrent les valeurs de la dernière colonne de la table source comme des valeurs pour une colonne de partition dans la table de destination. Gardez ceci à l'esprit lorsque vous essayez de créer une table partitionnée à partir d'une table non partitionnée.

Ressources

Pour plus d'informations sur l'utilisation de INSERT INTO avec le partitionnement, consultez les ressources suivantes.

Fichiers écrits dans Simple Storage Service (Amazon S3)

Athena écrit des fichiers dans des emplacements de données source dans Simple Storage Service (Amazon S3) comme résultat de la commande INSERT. Chaque opération INSERT crée un nouveau fichier, plutôt que d'ajouter à un fichier existant. L'emplacement des fichiers dépend de la structure de la table et de la requête SELECT, si elle est présente. Athena génère un fichier manifeste de données pour chaque requête INSERT. Le manifeste suit les fichiers écrits par la requête. Il est enregistré dans l'emplacement des résultats de requête Athena dans Simple Storage Service (Amazon S3). Pour de plus amples informations, consultez Identification des fichiers de sortie de requête.

Contournement des mises à jour hautement transactionnelles

Lorsque vous utilisez INSERT INTO pour ajouter des lignes à une table dans Amazon S3, Athena ne réécrit ni ne modifie les fichiers existants. Au lieu de cela, Athena écrit les lignes dans un ou plusieurs nouveaux fichiers. Néanmoins, les tables contenant de nombreux petits fichiers réduisent les performances des requêtes et les opérations d’écriture et de lecture comme PutObject et GetObject entraînent des coûts plus élevés dans Amazon S3. Il convient donc d’envisager les options suivantes lors de l’utilisation de INSERT INTO :

  • Exécutez des opérations INSERT INTO de façon moins fréquente sur des lots de lignes plus importants.

  • Dans le cadre de volumes d’ingestion de données importants, pensez à utiliser un service comme Amazon Data Firehose.

  • Évitez tout simplement d’utiliser INSERT INTO. Accumulez plutôt les lignes dans des fichiers plus volumineux et chargez-les directement sur Amazon S3, où Athena pourra les interroger.

Localisation de fichiers orphelins

Si une instruction CTAS ou INSERT INTO échoue, des données orphelines peuvent demeurer dans l’emplacement des données et pourraient être lues dans les requêtes suivantes. Pour localiser les fichiers orphelins en vue d'une inspection ou d'une suppression, vous pouvez utiliser le fichier manifeste de données fourni par Athena pour suivre la liste des fichiers à écrire. Pour plus d’informations, consultez Identification des fichiers de sortie de requête et DataManifestLocation.

INSERT INTO...SELECT

Spécifie la requête à exécuter sur une table, source_table, qui détermine les lignes à insérer dans une deuxième table, destination_table. Si la requête SELECT spécifie des colonnes de la source_table, les colonnes doivent correspondre exactement à celles de la destination_table.

Pour plus d'informations sur les requêtes SELECT, consultez SELECT.

Résumé

INSERT INTO destination_table SELECT select_query FROM source_table_or_view

Exemples

Sélectionner toutes les lignes de la table vancouver_pageviews et insérez-les dans la table canada_pageviews :

INSERT INTO canada_pageviews SELECT * FROM vancouver_pageviews;

Sélectionner uniquement les lignes de la table vancouver_pageviews où la colonne date a une valeur comprise entre 2019-07-01 et 2019-07-31, puis les insérer dans canada_july_pageviews :

INSERT INTO canada_july_pageviews SELECT * FROM vancouver_pageviews WHERE date BETWEEN date '2019-07-01' AND '2019-07-31';

Sélectionner les valeurs des colonnes city et state de la table cities_world uniquement à partir des lignes avec la valeur usa dans la colonne country, puis les insérer dans les colonnes city et state de la table cities_usa :

INSERT INTO cities_usa (city,state) SELECT city,state FROM cities_world WHERE country='usa'

INSERT INTO...VALUES

Insère des lignes dans une table existante en spécifiant des colonnes et des valeurs. Les colonnes spécifiées et les types de données associés doivent correspondre précisément aux colonnes et aux types de données de la table de destination.

Important

Nous vous déconseillons d'insérer des lignes à l'aide de VALUES, car Athena génère des fichiers pour chaque opération INSERT. Cela peut entraîner la création de nombreux petits fichiers et dégrader les performances de requête de la table. Pour identifier les fichiers créés par une requête INSERT, examinez le fichier manifeste de données. Pour de plus amples informations, consultez Utilisation des résultats des requêtes et des requêtes récentes.

Résumé

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

Exemples

Dans les exemples suivants, la table cities comporte quatre colonnes : , , et: id, city, state, state_motto. La colonne id est de type INT et toutes les autres colonnes sont de type VARCHAR.

Insérer une seule ligne dans la table cities, avec toutes les valeurs de colonne spécifiées :

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')

Insérer deux lignes dans la table cities :

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'), (3,'Boise','ID','Esto perpetua')