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êteINSERT
ne sont pas chiffrés par défaut. Nous vous recommandons de chiffrer les résultats de la requêteINSERT
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 rubriqueINSERT 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 NoteLes 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
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 Utilisez 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 UtilisationCTAS, INSERT INTO pour ETL et 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 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')