Vložit

Vložit z dotazů select

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

Vloží data do tabulky nebo oddílu z tabulky výsledků příkazu SELECT. Data jsou vložena podle pořadového čísla (řazení sloupců) a nikoli podle názvů.

Poznámka

(Delta Lake na Azure Databricks) Pokud má sloupec NOT NULL omezenía INSERT INTO příkaz nastaví hodnotu sloupce na NULL , SparkException je vyvolána.

OVERWRITE

Přepsat existující data v tabulce nebo oddílu. V opačném případě se připojí nová data.

Příklady

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

Vložení hodnot do tabulek

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

Vloží data do tabulky nebo oddílu ze seznamu hodnot řádků.

OVERWRITE

Přepsat existující data v tabulce nebo oddílu. V opačném případě se připojí nová data.

Příklady

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

Vložení dynamického oddílu

V nástroji part_spec jsou hodnoty sloupce oddílu volitelné. Pokud part_spec není zadána úplná specifikace oddílu, tato vložení se nazývají Dynamická vložení oddílů nebo vkládání s více oddíly. Pokud nejsou zadány hodnoty, jsou tyto sloupce označovány jako sloupce dynamického oddílu; v opačném případě jsou to sloupce statických oddílů. Například specifikace oddílu (p1 = 3, p2, p3) má sloupec statický oddíl ( p1 ) a dva sloupce dynamického oddílu ( p2 a p3 ).

V nástroji part_spec musí klíče statického oddílu nacházet před klíči dynamického oddílu. To znamená, že všechny sloupce oddílů, které mají konstantní hodnoty, se musí vyskytovat před dalšími sloupci oddílů, které nemají přiřazenou konstantní hodnotu.

Hodnoty oddílů pro sloupce dynamických oddílů jsou určeny při provádění. Sloupce dynamického oddílu musí být zadány jako poslední v part_spec a vstupní sada výsledků dotazu (ze seznamů hodnot řádků nebo příkazu SELECT). Jsou vyřešeny podle pozice, nikoli podle názvů. Proto musí být objednávky přesně spárovány.

Rozhraní API DataFrameWriter nemají rozhraní pro určení hodnot oddílů. Proto insertInto() rozhraní API vždy používá režim dynamického oddílu.

Důležité

V režimu dynamického oddílu může sada výsledků vstupu způsobit velký počet dynamických oddílů a vygeneruje tak velký počet adresářů oddílů.

OVERWRITE

Sémantika se liší v závislosti na typu cílové tabulky.

  • Tabulky SerDe podregistru: INSERT OVERWRITE neodstraní oddíly předem a přepíše pouze ty oddíly, na které jsou zapsána data za běhu. To odpovídá sémantikě Apache Hive. V případě tabulek SerDe v podregistru Spark SQL respektuje konfiguraci vztahující se k podregistru, včetně hive.exec.dynamic.partition a hive.exec.dynamic.partition.mode .
  • Tabulky nativních zdrojů dat: INSERT OVERWRITE nejprve odstraní všechny oddíly, které odpovídají specifikaci oddílu (např. partition (a = 1, b)), a pak vloží všechny zbývající hodnoty. Chování tabulek nativních zdrojů dat se dá změnit tak, aby byly konzistentní s tabulkami SerDe podregistru, a to změnou konfigurace specifické spark.sql.sources.partitionOverwriteMode pro relaci na DYNAMIC . Výchozí režim je STATIC.

Příklady

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

Vložit hodnoty do adresáře

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

Vložte výsledky dotazu select_statement do adresáře directory_path pomocí nativního formátu Spark. Pokud zadaná cesta existuje, je nahrazena výstupem select_statement .

DIRECTORY

Cesta k cílovému adresáři pro vložení. Adresář lze také zadat OPTIONS pomocí klíče path . Pokud zadaná cesta existuje, je nahrazena výstupem select_statement . Pokud LOCAL se použije, bude adresář v místním systému souborů.

USING

Formát souboru, který se má použít pro vložení Jedna z TEXT názvů třídy,,,,, CSV JSON , a JDBC PARQUET ORC HIVE LIBSVM , nebo plně kvalifikovaný název třídy vlastní implementace org.apache.spark.sql.sources.DataSourceRegister .

AS

Naplňte cílový adresář vstupními daty z příkazu SELECT.

Příklady

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

Vložení hodnot do adresáře s formátem podregistru

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

select_statementDo adresáře directory_path pomocí SerDe podregistru vložte výsledky dotazu. Pokud zadaná cesta existuje, je nahrazena výstupem select_statement .

Poznámka

Tento příkaz je podporován pouze v případě, že je povolena podpora podregistru.

DIRECTORY

Cesta k cílovému adresáři pro vložení. Pokud zadaná cesta existuje, bude nahrazena výstupem select_statement . Pokud LOCAL se použije, bude adresář v místním systému souborů.

ROW FORMAT

Pomocí SERDE klauzule určete vlastní SerDe pro toto vložení. V opačném případě použijte DELIMITED klauzuli pro použití nativního SerDe a určete oddělovač, řídicí znak, znak null a tak dále.

STORED AS

Formát souboru pro toto vložení Jedna z TEXTFILE ,,,, a SEQUENCEFILE RCFILE ORC PARQUET AVRO . Alternativně můžete zadat vlastní vstupní a výstupní formát prostřednictvím INPUTFORMAT a OUTPUTFORMAT . Pouze TEXTFILE , a SEQUENCEFILE RCFILE lze použít s a ROW FORMAT SERDE lze použít pouze TEXTFILE s ROW FORMAT DELIMITED .

AS

Naplňte cílový adresář vstupními daty z příkazu SELECT.

Příklady

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