INSERT INTO - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

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 Chiffrez les résultats des requêtes Athena stockés dans Amazon S3. Pour activer le chiffrement à l'aide de l'API AWS CLI ou Athena, utilisez les EncryptionConfiguration propriétés de l'StartQueryExecutionaction pour spécifier les options de chiffrement 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 plus d’informations, consultez Spécifier l'emplacement des résultats d'une requête à l'aide de la console Athena.

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

Formats pris en charge et SerDes

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

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 CSV, TSV et avec séparateur personnalisé sont pris en charge.

Tables compartimentées non prises en charge

INSERT INTO n'est pas pris en charge sur les tables compartimentées. Pour plus d’informations, consultez Utiliser le partitionnement et le cloisonnement.

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 Utiliser 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 Utilisez 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 plus d’informations, consultez Identifier les fichiers de sortie des requêtes.

Évitez les mises à jour hautement transactionnelles

Lorsque vous ajoutez INSERT INTO des lignes à une table dans Amazon S3, Athena ne réécrit ni ne modifie les fichiers existants. Au lieu de cela, il écrit les lignes sous la forme d'un ou de plusieurs nouveaux fichiers. Étant donné que les tables contenant de nombreux petits fichiers réduisent les performances des requêtes et que les opérations d'écriture PutObject et de lecture GetObject entraînent des coûts plus élevés pour Amazon S3, considérez les options suivantes lors de l'utilisation INSERT INTO :

  • Exécutez INSERT INTO des opérations moins fréquemment sur des lots de lignes plus importants.

  • Pour les gros volumes d'ingestion de données, pensez à utiliser un service tel qu'Amazon Data Firehose.

  • Évitez INSERT INTO complètement de l'utiliser. 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 INSERT INTO instruction CTAS or échoue, les données orphelines peuvent être laissées à l'emplacement des données et peuvent ê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 Identifier les fichiers de sortie des requêtes 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 plus d’informations, consultez Travailler avec les résultats des requêtes et les 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 : id, city, state et 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')