INSERT INTO
Fügt neue Zeilen in eine Zieltabelle ein, basierend auf einer SELECT-Abfrageanweisung, die in einer Quelltabelle ausgeführt wird, oder basierend auf einem Satz von VALUES, der als Teil der Anweisung bereitgestellt wird. Wenn die Quelltabelle auf zugrunde liegenden Daten in einem Format wie CSV oder JSON basiert und die Zieltabelle auf einem anderen Format wie Parquet oder ORC basiert, können Sie INSERT INTO-Abfragen verwenden, um ausgewählte Daten in das Format der Zieltabelle zu transformieren.
Überlegungen und Einschränkungen
Beachten Sie Folgendes, wenn Sie INSERT-Abfragen mit Athena verwenden.
-
Wenn Sie eine
INSERT-Abfrage für eine Tabelle mit zugrunde liegenden Daten ausführen, die in Amazon S3 verschlüsselt sind, werden die Ausgabedateien, die dieINSERT-Abfrage schreibt, standardmäßig nicht verschlüsselt. Wir empfehlen,INSERT-Abfrageergebnisse zu verschlüsseln, wenn Sie in Tabellen mit verschlüsselten Daten einfügen.Weitere Informationen zum Verschlüsseln von Abfrageergebnissen mithilfe der Konsole finden Sie unter Verschlüsseln Sie die in Amazon S3 gespeicherten Athena-Abfrageergebnisse. Um die Verschlüsselung mit der AWS CLI oder der Athena-API zu aktivieren, verwenden Sie die
EncryptionConfiguration-Eigenschaften der StartQueryExecution-Aktion, um die Amazon-S3-Verschlüsselungsoptionen entsprechend Ihren Anforderungen anzugeben. -
Für
INSERT INTO-Anweisungen gilt die erwartete Bucket-Eigentümereinstellung nicht für den Speicherort der Zieltabelle in Amazon S3. Die erwartete Bucket-Eigentümereinstellung gilt nur für den Amazon-S3-Ausgabespeicherort, den Sie für Athena-Abfrageergebnisse angeben. Weitere Informationen finden Sie unter Angeben eines Speicherorts des Abfrageergebnisses mithilfe der Athena-Konsole. -
ACID-konforme
INSERT INTO-Anweisungen finden Sie imINSERT INTO-Abschnitt von Iceberg-Tabellendaten aktualisieren.
Unterstützte Formate und SerDes
Sie können eine INSERT-Abfrage für Tabellen ausführen, die aus Daten mit den folgenden Formaten und SerDes erstellt wurden.
| Data format (Datenformat) | 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 |
|
Textdatei |
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe AnmerkungTSV- und benutzerdefinierte, durch Trennzeichen getrennte Dateien werden unterstützt. |
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerdeAnmerkungSchreibvorgänge werden nur für String-Typen unterstützt. Von Athena aus können Sie nicht in Tabellen schreiben, die Nicht-String-Typen im Glue-Schema enthalten. Weitere Informationen finden Sie unter CSV SerDe. |
Bucket-Tabellen werden nicht unterstützt
INSERT INTO wird für Bucket-Tabellen nicht unterstützt. Weitere Informationen finden Sie unter Partitionierung und Bucketing verwenden.
Verbundabfragen werden nicht unterstützt
INSERT INTO wird für Verbundabfragen nicht unterstützt. Ein Versuch, dies zu tun, kann zur Fehlermeldung führen: Dieser Vorgang wird derzeit für externe Kataloge nicht unterstützt. Weitere Informationen zu Verbundabfragen finden Sie unter Nutzung von Amazon-Athena-Verbundabfrage.
Partitionierung
Beachten Sie die Punkte in diesem Abschnitt, wenn Sie die Partitionierung mit INSERT
INTO- oder CREATE TABLE AS SELECT-Abfragen verwenden.
Einschränkungen
Die Anweisung INSERT INTO unterstützt das Schreiben von maximal 100 Partitionen in die Zieltabelle. Wenn Sie die SELECT-Klausel für eine Tabelle mit mehr als 100 Partitionen ausführen, schlägt die Abfrage fehl, es sei denn, die SELECT-Abfrage ist auf 100 Partitionen oder weniger beschränkt.
Hinweise zum Umgehen dieser Einschränkung finden Sie unter Verwenden von CTAS und INSERT INTO zum Umgehen des Limits von 100 Partitionen.
Spalten-Reihenfolge
INSERT INTO- oder CREATE TABLE AS SELECT-Anweisungen erwarten, dass die partitionierte Spalte die letzte Spalte in der Liste der projizierten Spalten in einer SELECT-Anweisung ist.
Wenn die Quelltabelle nicht partitioniert ist oder im Vergleich zur Zieltabelle auf verschiedene Spalten partitioniert ist, betrachten Abfragen wie INSERT INTO
die Werte in der letzten Spalte der Quelltabelle als Werte für eine Partitionsspalte in der Zieltabelle. Beachten Sie dies beim Versuch, eine partitionierte Tabelle aus einer nicht partitionierten Tabelle zu erstellen.destination_table SELECT * FROM
source_table
Ressourcen
Weitere Informationen zur Verwendung von INSERT INTO mit Partitionierung finden Sie in den folgenden Ressourcen.
-
Hinweise zum Einfügen von partitionierten Daten in eine partitionierte Tabelle finden Sie unter Verwenden von CTAS und INSERT INTO zum Umgehen des Limits von 100 Partitionen.
-
Hinweise zum Einfügen von nicht-partitionierten Daten in eine partitionierte Tabelle finden Sie unter Verwenden von CTAS und INSERT INTO für ETL und Datenanalyse.
In Amazon S3 geschriebene Dateien
Athena schreibt Dateien in die Quelldatenspeicherorte in Amazon S3 als Ergebnis des INSERT-Befehls. Jede INSERT-Operation erstellt eine neue Datei, anstatt an eine vorhandene Datei anzuhängen. Die Dateispeicherorte hängen von der Struktur der Tabelle und ggf. der SELECT-Abfrage ab. Athena generiert für jede INSERT-Abfrage eine Daten-Manifest-Datei. Das Manifest verfolgt die Dateien, die die Abfrage geschrieben hat. Es wird im Verzeichnis der Athena-Abfrageergebnisse in Amazon S3 gespeichert. Weitere Informationen finden Sie unter Identifizieren von Abfrageausgabedateien.
Transaktionsintensive Aktualisierungen vermeiden
Wenn Sie INSERT INTO verwenden um Zeilen zu einer Tabelle in Amazon S3 hinzufügen, schreibt Athena keine vorhandenen Dateien neu und nimmt auch keine Änderungen daran vor. Stattdessen schreibt es die Zeilen als eine oder mehrere neue Dateien. Da Tabellen mit vielen kleinen Dateien zu einer geringeren Abfrageleistung führen und Schreib- und Lesevorgänge wie PutObject und GetObject zu höheren Kosten von Amazon S3 führen, sollten Sie bei der Verwendung von INSERT INTO die folgenden Optionen in Betracht ziehen:
-
Führen Sie
INSERT INTO-Operationen seltener für größere Stapel von Zeilen aus. -
Bei großen Datenerfassungsmengen sollten Sie einen Service wie Amazon Data Firehose in Betracht ziehen.
-
Vermeiden Sie gänzlich die Verwendung von
INSERT INTO. Sammeln Sie stattdessen Zeilen in größeren Dateien und laden Sie sie direkt auf Amazon S3 hoch, wo sie von Athena abgefragt werden können.
Suchen verwaister Dateien
Wenn eine CTAS oder INSERT INTO-Anweisung fehlschlägt, können verwaiste Daten an dem Datenspeicherort verbleiben und möglicherweise in nachfolgenden Abfragen gelesen werden. Zur Suche nach verwaisten Dateien zwecks Überprüfung oder Löschung können Sie die Daten-Manifest-Datei verwenden, die Athena zur Verfügung stellt, um die Liste der zu schreibenden Dateien zu verfolgen. Weitere Informationen finden Sie unter Identifizieren von Abfrageausgabedateien und DataManifestLocation.
INSERT INTO...SELECT
Gibt die Abfrage an, die für eine Tabelle ausgeführt werden soll, source_table, die festlegt, welche Zeilen in eine zweite Tabelle eingefügt werden sollen, destination_table. Wenn die SELECT-Abfrage Spalten in der source_table angibt, müssen die Spalten genau mit denen in der destination_table übereinstimmen.
Weitere Informationen zu SELECT-Abfragen finden Sie unter SELECT.
Syntax
INSERT INTO destination_table
SELECT select_query
FROM source_table_or_view
Beispiele
Wählen Sie alle Zeilen in der vancouver_pageviews-Tabelle aus und fügen Sie sie in die canada_pageviews-Tabelle ein:
INSERT INTO canada_pageviews SELECT * FROM vancouver_pageviews;
Wählen Sie nur die Zeilen in der vancouver_pageviews-Tabelle aus, in denen die date-Spalte einen Wert zwischen 2019-07-01 und 2019-07-31 hat, und fügen Sie sie dann in canada_july_pageviews ein:
INSERT INTO canada_july_pageviews SELECT * FROM vancouver_pageviews WHERE date BETWEEN date '2019-07-01' AND '2019-07-31';
Wählen Sie die Werte in den Spalten city und state in der cities_world-Tabelle nur aus den Zeilen mit dem Wert usa in der Spalte country aus und fügen Sie sie in die Spalten city und state in der cities_usa-Tabelle ein:
INSERT INTO cities_usa (city,state) SELECT city,state FROM cities_world WHERE country='usa'
INSERT INTO...VALUES
Fügt Zeilen in eine vorhandene Tabelle ein, indem Spalten und Werte angegeben werden. Angegebene Spalten und zugehörige Datentypen müssen genau mit den Spalten und Datentypen in der Zieltabelle übereinstimmen.
Wichtig
Wir raten davon ab, Zeilen mit VALUES einzufügen, da Athena Dateien für jede INSERT-Operation generiert. Dies kann dazu führen, dass viele kleine Dateien erstellt werden und die Abfrageleistung der Tabelle beeinträchtigen. Um Dateien zu identifizieren, die eine INSERT-Abfrage erstellt, überprüfen Sie die Daten-Manifest-Datei. Weitere Informationen finden Sie unter Arbeiten mit Abfrageergebnissen und aktuellen Abfragen.
Syntax
INSERT INTO destination_table [(col1,col2,...)]
VALUES (col1value,col2value,...)[,
(col1value,col2value,...)][,
...]
Beispiele
In den folgenden Beispielen hat die Tabelle "cities" drei Spalten: id, city, state, state_motto. Die id-Spalte hat den Typ INT und alle anderen Spalten haben den Typ VARCHAR.
Fügen Sie eine einzelne Zeile in die cities-Tabelle ein, wobei alle Spaltenwerte angegeben sind:
INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
Fügen Sie zwei Zeilen in die cities-Tabelle ein:
INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'), (3,'Boise','ID','Esto perpetua')