EinfügenInsert

Aus SELECT-Abfragen einfügenInsert from select queries

INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] select_statement

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement

part_spec:
  : (part_col_name1=val1 [, part_col_name2=val2, ...])

Fügen Sie Daten aus der Ergebnistabelle einer SELECT-Anweisung in eine Tabelle oder eine Partition ein.Insert data into a table or a partition from the result table of a select statement. Daten werden durch Ordinalzahl (Spalten Sortierung) und nicht durch Namen eingefügt.Data is inserted by ordinal (ordering of columns) and not by names.

OVERWRITE

Überschreibt vorhandene Daten in der Tabelle oder der Partition.Overwrite existing data in the table or the partition. Andernfalls werden neue Daten angehängt.Otherwise, new data is appended.

Hinweis

In Databricks Runtime 7,0 und höher unterstützt die Schema Erzwingung INSERT und die Entwicklung mit Delta Lake.In Databricks Runtime 7.0 and above, INSERT supports schema enforcement and evolution with Delta Lake. 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.

BeispieleExamples

-- Creates a partitioned native parquet table
CREATE TABLE data_source_tab1 (col1 INT, p1 INT, p2 INT)
  USING PARQUET PARTITIONED BY (p1, p2)

-- Appends two rows into the partition (p1 = 3, p2 = 4)
INSERT INTO data_source_tab1 PARTITION (p1 = 3, p2 = 4)
  SELECT id FROM RANGE(1, 3)

-- Overwrites the partition (p1 = 3, p2 = 4) using two new rows
INSERT OVERWRITE TABLE default.data_source_tab1 PARTITION (p1 = 3, p2 = 4)
  SELECT id FROM RANGE(3, 5)

Werte in Tabellen einfügenInsert values into tables

INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]

values_row:
    : (val1 [, val2, ...])

Fügen Sie Daten aus einer Zeilen Wert Liste in eine Tabelle oder eine Partition ein.Insert data into a table or a partition from a row value list.

OVERWRITE

Überschreibt vorhandene Daten in der Tabelle oder der Partition.Overwrite existing data in the table or the partition. Andernfalls werden neue Daten angehängt.Otherwise, new data is appended.

BeispieleExamples

-- Creates a partitioned hive serde table (using the HiveQL syntax)
CREATE TABLE hive_serde_tab1 (col1 INT, p1 INT, p2 INT)
  USING HIVE OPTIONS(fileFormat 'PARQUET') PARTITIONED BY (p1, p2)

-- Appends two rows into the partition (p1 = 3, p2 = 4)
INSERT INTO hive_serde_tab1 PARTITION (p1 = 3, p2 = 4)
  VALUES (1), (2)

-- Overwrites the partition (p1 = 3, p2 = 4) using two new rows
INSERT OVERWRITE TABLE hive_serde_tab1 PARTITION (p1 = 3, p2 = 4)
  VALUES (3), (4)

Dynamische Partitions EinfügungenDynamic partition inserts

Wenn die Partitions Spezifikation part_spec nicht vollständig bereitgestellt ist, werden solche Einfügungen als Einfügungen dynamischer Partitionen aufgerufen, die auch als Einfügungen mit mehreren Partitionen bezeichnet werden.When the partition specification part_spec is not completely provided, such inserts are called as the dynamic partition inserts, also called as multi-partition inserts. In part_spec sind die Werte der partitions Spalte optional.In part_spec, the partition column values are optional. 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 given, 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 dynamische Partitions Spalten (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 die statischen Partitions Schlüssel vor den dynamischen Partitions Schlüsseln stehen.In part_spec, the 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.That means, all partition columns having constant values need to 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.

Derzeit verfügen die dataframewriter-APIs nicht über eine Schnittstelle zum Angeben von Partitions Werten.Currently the DataFrameWriter APIs do not have an interface to specify partition values. Daher verwendet die insertInto() API immer den dynamischen Partitions Modus.Therefore, its 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 the 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 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, für die während der Laufzeit Daten geschrieben wurden.Hive SerDe tables: INSERT OVERWRITE doesn’t delete partitions ahead, and only overwrite 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. Das Verhalten von nativen Datenquellen Tabellen kann so geändert werden, dass Sie mit Hive-Server Tabellen konsistent sind, indem die Sitzungs spezifische Konfiguration in geändert wird spark.sql.sources.partitionOverwriteMode DYNAMIC .The behavior of native data source tables can be changed 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

-- Create a partitioned native Parquet table
CREATE TABLE data_source_tab2 (col1 INT, p1 STRING, p2 STRING)
  USING PARQUET PARTITIONED BY (p1, p2)

-- Two partitions ('part1', 'part1') and ('part1', 'part2') are created by this dynamic insert.
-- The dynamic partition column p2 is resolved by the last column `'part' || id`
INSERT INTO data_source_tab2 PARTITION (p1 = 'part1', p2)
  SELECT id, 'part' || id FROM RANGE(1, 3)

-- A new partition ('partNew1', 'partNew2') is added by this INSERT OVERWRITE.
INSERT OVERWRITE TABLE data_source_tab2 PARTITION (p1 = 'partNew1', p2)
  VALUES (3, 'partNew2')

-- After this INSERT OVERWRITE, the two partitions ('part1', 'part1') and ('part1', 'part2') are dropped,
-- because both partitions are included by (p1 = 'part1', p2).
-- Then, two partitions ('partNew1', 'partNew2'), ('part1', 'part1') exist after this operation.
INSERT OVERWRITE TABLE data_source_tab2 PARTITION (p1 = 'part1', p2)
  VALUES (5, 'part1')

-- Create and fill a partitioned hive serde table with three partitions:
-- ('part1', 'part1'), ('part1', 'part2') and ('partNew1', 'partNew2')
CREATE TABLE hive_serde_tab2 (col1 INT, p1 STRING, p2 STRING)
  USING HIVE OPTIONS(fileFormat 'PARQUET') PARTITIONED BY (p1, p2)
INSERT INTO hive_serde_tab2 PARTITION (p1 = 'part1', p2)
  SELECT id, 'part' || id FROM RANGE(1, 3)
INSERT OVERWRITE TABLE hive_serde_tab2 PARTITION (p1 = 'partNew1', p2)
  VALUES (3, 'partNew2')

-- After this INSERT OVERWRITE, only the partitions ('part1', 'part1') is overwritten by the new value.
-- All the three partitions still exist.
INSERT OVERWRITE TABLE hive_serde_tab2 PARTITION (p1 = 'part1', p2)
  VALUES (5, 'part1')

Werte in Verzeichnis einfügenInsert values into directory

INSERT OVERWRITE [LOCAL] DIRECTORY [directory_path]
  USING data_source [OPTIONS (key1=val1, key2=val2, ...)]
  [AS] SELECT ... FROM ...

Fügen Sie die Abfrageergebnisse von select_statement mithilfe des directory_path nativen Spark-Formats in ein Verzeichnis ein.Insert the query results of select_statement into a directory directory_path using Spark native format. Wenn der angegebene Pfad vorhanden ist, wird er durch die Ausgabe von ersetzt select_statement .If the specified path exists, it is replaced with the output of the select_statement.

DIRECTORY

Der Pfad des Zielverzeichnisses der Einfügung.The path of the destination directory of the insert. Das Verzeichnis kann auch in OPTIONS mithilfe des Schlüssels angegeben werden path .The directory can also be specified in OPTIONS using the key path. Wenn der angegebene Pfad vorhanden ist, wird er durch die Ausgabe von ersetzt select_statement .If the specified path exists, it is replaced with the output of the select_statement. Wenn LOCAL verwendet wird, befindet sich das Verzeichnis auf dem lokalen Dateisystem.If LOCAL is used, the directory is on the local file system.

USING

Das für die Einfügung zu verwendende Dateiformat.The file format to use for the insert. Eine von TEXT , CSV , JSON , JDBC , PARQUET , ORC , HIVE und LIBSVM oder ein voll qualifizierter Klassenname einer benutzerdefinierten Implementierung von org.apache.spark.sql.sources.DataSourceRegister .One of TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, and LIBSVM, or a fully qualified class name of a custom implementation of org.apache.spark.sql.sources.DataSourceRegister.

AS

Füllen Sie das Zielverzeichnis mit Eingabedaten aus der SELECT-Anweisung auf.Populate the destination directory with input data from the select statement.

BeispieleExamples

INSERT OVERWRITE DIRECTORY
USING parquet
OPTIONS ('path' '/tmp/destination/path')
SELECT key, col1, col2 FROM source_table

INSERT OVERWRITE DIRECTORY '/tmp/destination/path'
USING json
SELECT 1 as a, 'c' as b

Einfügen von Werten in das Verzeichnis mit dem Hive-FormatInsert values into directory with Hive format

INSERT OVERWRITE [LOCAL] DIRECTORY directory_path
  [ROW FORMAT row_format] [STORED AS file_format]
  [AS] select_statement

Fügen Sie die Abfrageergebnisse von select_statement mithilfe von directory_path Hive serde in ein Verzeichnis ein.Insert the query results of select_statement into a directory directory_path using Hive SerDe. Wenn der angegebene Pfad vorhanden ist, wird er durch die Ausgabe von ersetzt select_statement .If the specified path exists, it is replaced with the output of the select_statement.

Hinweis

Dieser Befehl wird nur unterstützt, wenn die Hive-Unterstützung aktiviert ist.This command is supported only when Hive support is enabled.

DIRECTORY

Der Pfad des Zielverzeichnisses der Einfügung.The path of the destination directory of the insert. Wenn der angegebene Pfad vorhanden ist, wird er durch die Ausgabe von ersetzt select_statement .If the specified path exists, it will be replaced with the output of the select_statement. Wenn LOCAL verwendet wird, befindet sich das Verzeichnis auf dem lokalen Dateisystem.If LOCAL is used, the directory is on the local file system.

ROW FORMAT

Verwenden Sie die- SERDE Klausel, um ein benutzerdefiniertes serde für diese Einfügung anzugeben.Use the SERDE clause to specify a custom SerDe for this insert. Verwenden Sie andernfalls die DELIMITED -Klausel, um den systemeigenen Server zu verwenden, und geben Sie das Trennzeichen, das Escapezeichen, das NULL-Zeichen usw. an.Otherwise, use the DELIMITED clause to use the native SerDe and specify the delimiter, escape character, null character, and so on.

STORED AS

Das Dateiformat für diese Einfügung.The file format for this insert. Eine von TEXTFILE , SEQUENCEFILE , RCFILE , ORC , PARQUET und AVRO .One of TEXTFILE, SEQUENCEFILE, RCFILE, ORC, PARQUET, and AVRO. Alternativ können Sie Ihr eigenes Eingabe-und Ausgabeformat über INPUTFORMAT und angeben OUTPUTFORMAT .Alternatively, you can specify your own input and output format through INPUTFORMAT and OUTPUTFORMAT. Nur TEXTFILE , SEQUENCEFILE und RCFILE können mit verwendet werden ROW FORMAT SERDE und TEXTFILE können nur mit verwendet werden ROW FORMAT DELIMITED .Only TEXTFILE, SEQUENCEFILE, and RCFILE can be used with ROW FORMAT SERDE, and only TEXTFILE can be used with ROW FORMAT DELIMITED.

AS

Füllen Sie das Zielverzeichnis mit Eingabedaten aus der SELECT-Anweisung auf.Populate the destination directory with input data from the select statement.

BeispieleExamples

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/destination/path'
STORED AS orc
SELECT * FROM source_table where key < 10