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
INSERTsur une table avec des données sous-jacentes chiffrées dans Simple Storage Service (Amazon S3), les fichiers de sortie écrit par la requêteINSERTne sont pas chiffrés par défaut. Nous vous recommandons de chiffrer les résultats de la requêteINSERTsi 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
EncryptionConfigurationde 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 INTOconformes à la norme ACID, voir la rubriqueINSERT INTOde 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 NoteLes fichiers TSV et les fichiers avec séparateur personnalisé sont pris en charge. |
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerdeNoteL’é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
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.destination_table SELECT * FROM
source_table
Ressources
Pour plus d'informations sur l'utilisation de INSERT INTO avec le partitionnement, consultez les ressources suivantes.
-
Pour insérer des données partitionnées dans une table partitionnée, voir Utilisation de CTAS et INSERT INTO pour contourner la limite de 100 partitions.
-
Pour insérer des données non partitionnées dans une table partitionnée, voir Utilisation de CTAS et INSERT INTO pour les opérations ETL et l’analyse des données.
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 INTOde 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')