Invoegen

Invoegen vanuit query's selecteren

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, ...])

Gegevens invoegen in een tabel of partitie uit de resultaattabel van een select-instructie. Gegevens worden ingevoegd door ordinale (volgorde van kolommen) en niet op namen.

Notitie

(Delta Lake op Azure Databricks) Als een kolom een beperking NOT NULL heeft eneen instructie een kolomwaarde in stelt INSERT INTO op , wordt een NULL SparkException opgeworpen.

OVERWRITE

Overschrijf bestaande gegevens in de tabel of de partitie. Anders worden nieuwe gegevens toegevoegd.

Voorbeelden

-- 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)

Waarden invoegen in tabellen

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, ...])

Gegevens invoegen in een tabel of partitie uit een lijst met rijwaarde.

OVERWRITE

Overschrijf bestaande gegevens in de tabel of de partitie. Anders worden nieuwe gegevens toegevoegd.

Voorbeelden

-- 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 partitie-invoegingen

In part_spec zijn de partitiekolomwaarden optioneel. Wanneer de partitiespecificatie niet volledig is opgegeven, worden dergelijke invoegingen dynamische partitie-invoegingen of invoegingen met meerdere part_spec partities genoemd. Wanneer de waarden niet zijn opgegeven, worden deze kolommen aangeduid als dynamische partitiekolommen; anders zijn het statische partitiekolommen. De partitiespecificatie (p1 = 3, p2, p3) heeft bijvoorbeeld een statische partitiekolom ( ) en twee dynamische p1 partitiekolommen ( p2 en p3 ).

In part_spec moeten statische partitiesleutels vóór de dynamische partitiesleutels komen. Dit betekent dat alle partitiekolommen met constante waarden moeten worden weergegeven vóór andere partitiekolommen die geen toegewezen constante waarde hebben.

De partitiewaarden van dynamische partitiekolommen worden bepaald tijdens de uitvoering. De dynamische partitiekolommen moeten als laatste worden opgegeven in zowel als de invoerresultaatset (van de rijwaardelijsten part_spec of de select-query). Ze worden opgelost op positie in plaats van op naam. De orders moeten dus exact overeenkomen.

De DataFrameWriter-API's hebben geen interface om partitiewaarden op te geven. Daarom gebruikt de insertInto() API altijd de dynamische partitiemodus.

Belangrijk

In de dynamische partitiemodus kan de set met invoerresultaat leiden tot een groot aantal dynamische partities, waardoor een groot aantal partitiedirecties wordt gegenereerd.

OVERWRITE

De semantiek is verschillend op basis van het type van de doeltabel.

  • Hive SerDe-tabellen: verwijdert partities niet vooruit en overschrijft alleen de partities die gegevens bevatten die er tijdens INSERT OVERWRITE runtime naar zijn geschreven. Dit komt overeen Apache Hive semantiek. Voor Hive SerDe-tabellen respecteert Spark SQL configuratie met betrekking tot Hive, waaronder hive.exec.dynamic.partition en hive.exec.dynamic.partition.mode .
  • Systeemeigen gegevensbrontabellen: verwijdert eerst alle partities die overeenkomen met de partitiespecificatie INSERT OVERWRITE (bijvoorbeeld PARTITION(a=1, b)) en voegt vervolgens alle resterende waarden in. Het gedrag van systeemeigen gegevensbrontabellen kan worden gewijzigd zodat deze consistent zijn met Hive SerDe-tabellen door de sessiespecifieke configuratie te spark.sql.sources.partitionOverwriteMode wijzigen in DYNAMIC . De standaardmodus is STATIC.

Voorbeelden

-- 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')

Waarden invoegen in map

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

Voeg de queryresultaten van in select_statement een map in met de native directory_path Spark-indeling. Als het opgegeven pad bestaat, wordt dit vervangen door de uitvoer van de select_statement .

DIRECTORY

Het pad van de doelmap van de invoeging. De map kan ook worden opgegeven in met OPTIONS behulp van de sleutel path . Als het opgegeven pad bestaat, wordt dit vervangen door de uitvoer van de select_statement . Als LOCAL wordt gebruikt, is de map op het lokale bestandssysteem.

USING

De bestandsindeling die moet worden gebruikt voor het invoegen. Een van , , , , , , , en , of een volledig gekwalificeerde klassenaam TEXT van een aangepaste implementatie CSV van JSON JDBC PARQUET ORC HIVE LIBSVM org.apache.spark.sql.sources.DataSourceRegister .

AS

Vul de doelmap met invoergegevens uit de select-instructie.

Voorbeelden

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

Waarden invoegen in map met Hive-indeling

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

Voeg de queryresultaten van select_statement in een map in met behulp van directory_path Hive SerDe. Als het opgegeven pad bestaat, wordt dit vervangen door de uitvoer van de select_statement .

Notitie

Deze opdracht wordt alleen ondersteund als Hive-ondersteuning is ingeschakeld.

DIRECTORY

Het pad van de doelmap van de invoeging. Als het opgegeven pad bestaat, wordt dit vervangen door de uitvoer van de select_statement . Als LOCAL wordt gebruikt, is de map op het lokale bestandssysteem.

ROW FORMAT

Gebruik de SERDE -component om een aangepaste SerDe voor deze invoeging op te geven. Gebruik anders de -component om de native SerDe te gebruiken en geef het DELIMITED scheidingsteken, escape-teken, null-teken, en meer op.

STORED AS

De bestandsindeling voor deze invoeging. Een van TEXTFILE , , , , , en SEQUENCEFILE RCFILE ORC PARQUET AVRO . U kunt ook uw eigen invoer- en uitvoerindeling opgeven via INPUTFORMAT en OUTPUTFORMAT . Alleen TEXTFILE , en kunnen worden gebruikt met en kunnen alleen worden gebruikt met SEQUENCEFILE RCFILE ROW FORMAT SERDE TEXTFILE ROW FORMAT DELIMITED .

AS

Vul de doelmap met invoergegevens uit de select-instructie.

Voorbeelden

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