INSERT INTOINSERT INTO

Fügt neue Zeilen in eine Tabelle ein.Inserts new rows into a table. Sie geben die eingefügten Zeilen nach Wert Ausdrücken oder das Ergebnis einer Abfrage an.You specify the inserted rows by value expressions or the result of a query.

SyntaxSyntax

INSERT INTO [ TABLE ] table_identifier [ partition_spec ]
    { VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }

Hinweis

Wenn Sie INSERT INTO eine Delta-Tabellen Schema Erzwingung und-Weiterentwicklung unterstützen.When you INSERT INTO a Delta table schema enforcement and evolution is supported. Wenn der Datentyp einer Spalte nicht sicher in den Datentyp einer Delta Tabelle umgewandelt werden kann, wird eine Lauf Zeit Ausnahme ausgelöst.If a column’s data type cannot be safely cast to a Delta table’s data type, a runtime exception is thrown. Wenn die Schema Entwicklung aktiviert ist, können neue Spalten als letzte Spalten des Schemas (bzw. der geschachtelte Columns) vorhanden sein, damit das Schema weiterentwickelt werden kann.If schema evolution is enabled, new columns can exist as the last columns of your schema (or nested columns) for the schema to evolve.

ParameterParameters

  • table_identifiertable_identifier

    • [database_name.] table_name: Ein Tabellenname, optional mit einem Datenbanknamen qualifiziert.[database_name.] table_name: A table name, optionally qualified with a database name.
    • delta. : der Speicherort einer vorhandenen Delta Tabelle. delta. : The location of an existing Delta table.
  • partition_specpartition_spec

    Ein optionaler Parameter, der eine durch Trennzeichen getrennte Liste von Schlüssel-Wert-Paaren für Partitionen angibt.An optional parameter that specifies a comma-separated list of key-value pairs for partitions.

    Syntax:PARTITION ( partition_col_name = partition_col_val [ , ... ] )Syntax: PARTITION ( partition_col_name = partition_col_val [ , ... ] )

  • Werte ({Wert | NULL} [,...]) [ , ( ... ) ]VALUES ( { value | NULL } [ , … ] ) [ , ( … ) ]

    Die einzufügenden Werte.The values to be inserted. Entweder ein explizit angegebener Wert oder ein NULL .Either an explicitly specified value or a NULL. Verwenden Sie ein Komma, um jeden Wert in der-Klausel voneinander zu trennen.Use a comma to separate each value in the clause. Sie können mehr als einen Satz von Werten angeben, um mehrere Zeilen einzufügen.You can specify more than one set of values to insert multiple rows.

  • queryquery

    Eine Abfrage, die die einzufügenden Zeilen erzeugt.A query that produces the rows to be inserted. Eines der folgenden Formate:One of following formats:

    • Eine- SELECT AnweisungA SELECT statement
    • Eine- TABLE AnweisungA TABLE statement
    • Eine- FROM AnweisungA FROM statement

Dynamische Partitions EinfügungenDynamic partition inserts

In part_spec sind die Werte der partitions Spalte optional.In part_spec, the partition column values are optional. Wenn die Partitions Spezifikation part_spec nicht vollständig bereitgestellt ist, werden solche Einfügungen als dynamische Partitions Einfügungen oder Einfügungen mit mehreren Partitionen bezeichnetWhen the partition specification part_spec is not completely provided, such inserts are called dynamic partition inserts or multi-partition inserts. Wenn die Werte nicht angegeben werden, werden diese Spalten als dynamische Partitions Spalten bezeichnet. andernfalls handelt es sich um statische Partitions Spalten.When the values are not specified, these columns are referred to as dynamic partition columns; otherwise, they are static partition columns. Beispielsweise verfügt die Partitions Spezifikation (p1 = 3, p2, p3) über eine statische partitions Spalte ( p1 ) und zwei Spalten mit dynamischen Partitionen ( p2 und p3 ).For example, the partition spec (p1 = 3, p2, p3) has a static partition column (p1) and two dynamic partition columns (p2 and p3).

In part_spec müssen statische Partitions Schlüssel vor den dynamischen Partitions Schlüsseln stehen.In part_spec, static partition keys must come before the dynamic partition keys. Dies bedeutet, dass alle Partitions Spalten mit Konstanten Werten vor anderen Partitions Spalten, denen kein konstanter Wert zugewiesen ist, angezeigt werden müssen.This means all partition columns having constant values must appear before other partition columns that do not have an assigned constant value.

Die Partitionswerte dynamischer Partitions Spalten werden während der Ausführung bestimmt.The partition values of dynamic partition columns are determined during the execution. Die Spalten für die dynamische Partition müssen zuletzt sowohl in part_spec als auch im eingaberesultset (der Zeilen Wert Listen oder der SELECT-Abfrage) angegeben werden.The dynamic partition columns must be specified last in both part_spec and the input result set (of the row value lists or the select query). Sie werden nicht nach Namen, sondern nach der Position aufgelöst.They are resolved by position, instead of by names. Daher müssen die Bestellungen exakt übereinstimmen.Thus, the orders must be exactly matched.

Die dataframewriter-APIs verfügen nicht über eine Schnittstelle zum Angeben von Partitions Werten.The DataFrameWriter APIs do not have an interface to specify partition values. Daher verwendet die insertInto() API immer den dynamischen Partitions Modus.Therefore, the insertInto() API is always using dynamic partition mode.

Wichtig

Im dynamischen Partitions Modus kann das eingaberesultset zu einer großen Anzahl dynamischer Partitionen führen und somit eine große Anzahl von Partitions Verzeichnissen generieren.In dynamic partition mode, the input result set could result in a large number of dynamic partitions, and thus generate a large number of partition directories.

OVERWRITE

Die einzufügenden Werte.The values to be inserted. Es kann entweder ein explizit angegebener Wert oder ein NULL-Wert eingefügt werden.Either an explicitly specified value or a NULL can be inserted. Ein Komma muss zum Trennen der einzelnen Werte in der-Klausel verwendet werden.A comma must be used to separate each value in the clause. Es können mehr als ein Satz von Werten angegeben werden, um mehrere Zeilen einzufügen.More than one set of values can be specified to insert multiple rows.

Die Semantik unterscheidet sich basierend auf dem Typ der Ziel Tabelle:The semantics are different based on the type of the target table:

  • Hive-Server Tabellen: INSERT OVERWRITE löscht keine Partitionen im voraus und überschreibt nur die Partitionen, die Daten zur Laufzeit in diese schreiben.Hive SerDe tables: INSERT OVERWRITE doesn’t delete partitions ahead, and only overwrites those partitions that have data written into it at runtime. Dies entspricht Apache Hive Semantik.This matches Apache Hive semantics. Bei Hive-Server Tabellen respektiert Spark SQL die Hive-bezogene Konfiguration, einschließlich hive.exec.dynamic.partition und hive.exec.dynamic.partition.mode .For Hive SerDe tables, Spark SQL respects the Hive-related configuration, including hive.exec.dynamic.partition and hive.exec.dynamic.partition.mode.
  • Native Datenquellen Tabellen: INSERT OVERWRITE löscht zuerst alle Partitionen, die der Partitions Spezifikation entsprechen (z. b. Partition (a = 1, b)) und fügt dann alle verbleibenden Werte ein.Native data source tables: INSERT OVERWRITE first deletes all the partitions that match the partition specification (e.g., PARTITION(a=1, b)) and then inserts all the remaining values. Sie können das Verhalten von nativen Datenquellen Tabellen so ändern, dass Sie mit Hive-Server Tabellen konsistent sind, indem Sie die Sitzungs spezifische Konfiguration spark.sql.sources.partitionOverwriteMode in ändern DYNAMIC .You can change the behavior of native data source tables to be consistent with Hive SerDe tables by changing the session-specific configuration spark.sql.sources.partitionOverwriteMode to DYNAMIC. Der Standardmodus ist STATIC.The default mode is STATIC.

BeispieleExamples

Inhalt dieses Abschnitts:In this section:

Einfügen einzelner Zeilen mithilfe einer- VALUES KlauselSingle row insert using a VALUES clause

CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    USING PARQUET PARTITIONED BY (student_id);

INSERT INTO students VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);

SELECT * FROM students;
+---------+---------------------+----------+
|     name|              address|student_id|
+---------+---------------------+----------+
|Amy Smith|123 Park Ave,San Jose|    111111|
+---------+---------------------+----------+

Einfügen von mehreren Zeilen mithilfe einer- VALUES KlauselMulti-row insert using a VALUES clause

INSERT INTO students VALUES
    ('Bob Brown', '456 Taylor St, Cupertino', 222222),
    ('Cathy Johnson', '789 Race Ave, Palo Alto', 333333);

SELECT * FROM students;
+-------------+------------------------+----------+
|         name|                 address|student_id|
+-------------+------------------------+----------+
|    Amy Smith|  123 Park Ave, San Jose|    111111|
+-------------+------------------------+----------+
|    Bob Brown|456 Taylor St, Cupertino|    222222|
+-------------+------------------------+----------+
|Cathy Johnson| 789 Race Ave, Palo Alto|    333333|
+--------------+-----------------------+----------+

INSERT mithilfe einer- SELECT AnweisungInsert using a SELECT statement

-- Assuming the persons table has already been created and populated.
SELECT * FROM persons;
+-------------+-------------------------+---------+
|         name|                  address|      ssn|
+-------------+-------------------------+---------+
|Dora Williams|134 Forest Ave, Melo Park|123456789|
+-------------+-------------------------+---------+
|  Eddie Davis|  245 Market St, Milpitas|345678901|
+-------------+-------------------------+---------+

INSERT INTO students PARTITION (student_id = 444444)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

SELECT * FROM students;
+-------------+-------------------------+----------+
|         name|                  address|student_id|
+-------------+-------------------------+----------+
|    Amy Smith|   123 Park Ave, San Jose|    111111|
+-------------+-------------------------+----------+
|    Bob Brown| 456 Taylor St, Cupertino|    222222|
+-------------+-------------------------+----------+
|Cathy Johnson|  789 Race Ave, Palo Alto|    333333|
+-------------+-------------------------+----------+
|Dora Williams|134 Forest Ave, Melo Park|    444444|
+-------------+-------------------------+----------+

INSERT mithilfe einer- TABLE AnweisungInsert using a TABLE statement

-- Assuming the visiting_students table has already been created and populated.
SELECT * FROM visiting_students;
+-------------+---------------------+----------+
|         name|              address|student_id|
+-------------+---------------------+----------+
|Fleur Laurent|345 Copper St, London|    777777|
+-------------+---------------------+----------+
|Gordon Martin| 779 Lake Ave, Oxford|    888888|
+-------------+---------------------+----------+

INSERT INTO students TABLE visiting_students;

SELECT * FROM students;
+-------------+-------------------------+----------+
|         name|                  address|student_id|
+-------------+-------------------------+----------+
|    Amy Smith|    123 Park Ave,San Jose|    111111|
+-------------+-------------------------+----------+
|    Bob Brown| 456 Taylor St, Cupertino|    222222|
+-------------+-------------------------+----------+
|Cathy Johnson|  789 Race Ave, Palo Alto|    333333|
+-------------+-------------------------+----------+
|Dora Williams|134 Forest Ave, Melo Park|    444444|
+-------------+-------------------------+----------+
|Fleur Laurent|    345 Copper St, London|    777777|
+-------------+-------------------------+----------+
|Gordon Martin|     779 Lake Ave, Oxford|    888888|
+-------------+-------------------------+----------+

INSERT mithilfe einer- FROM AnweisungInsert using a FROM statement

-- Assuming the applicants table has already been created and populated.
SELECT * FROM applicants;
+-----------+--------------------------+----------+---------+
|       name|                   address|student_id|qualified|
+-----------+--------------------------+----------+---------+
|Helen Davis| 469 Mission St, San Diego|    999999|     true|
+-----------+--------------------------+----------+---------+
|   Ivy King|367 Leigh Ave, Santa Clara|    101010|    false|
+-----------+--------------------------+----------+---------+
| Jason Wang|     908 Bird St, Saratoga|    121212|     true|
+-----------+--------------------------+----------+---------+

INSERT INTO students
     FROM applicants SELECT name, address, id applicants WHERE qualified = true;

SELECT * FROM students;
+-------------+-------------------------+----------+
|         name|                  address|student_id|
+-------------+-------------------------+----------+
|    Amy Smith|   123 Park Ave, San Jose|    111111|
+-------------+-------------------------+----------+
|    Bob Brown| 456 Taylor St, Cupertino|    222222|
+-------------+-------------------------+----------+
|Cathy Johnson|  789 Race Ave, Palo Alto|    333333|
+-------------+-------------------------+----------+
|Dora Williams|134 Forest Ave, Melo Park|    444444|
+-------------+-------------------------+----------+
|Fleur Laurent|    345 Copper St, London|    777777|
+-------------+-------------------------+----------+
|Gordon Martin|     779 Lake Ave, Oxford|    888888|
+-------------+-------------------------+----------+
|  Helen Davis|469 Mission St, San Diego|    999999|
+-------------+-------------------------+----------+
|   Jason Wang|    908 Bird St, Saratoga|    121212|
+-------------+-------------------------+----------+