INSERT INTO

Wstawia nowe wiersze do tabeli i opcjonalnie obcina tabelę lub partycje. Należy określić wstawione wiersze według wyrażeń wartości lub wyniku zapytania.

Składnia

INSERT { OVERWRITE | INTO } [ TABLE ] table_name
    [ PARTITION clause ]
    [ ( column_name [, ...] ) ]
    query

Uwaga

W przypadku INSERT INTO wymuszania i ewolucji schematu tabeli delty jest obsługiwane. Jeśli nie można bezpiecznie rzutować typu danych kolumny na typ danych tabeli delty, zgłaszany jest wyjątek środowiska uruchomieniowego. Jeśli ewolucja schematu jest włączona, nowe kolumny mogą istnieć jako ostatnie kolumny schematu (lub kolumny zagnieżdżone), aby schemat ewoluował.

Parametry

  • INTO Lub OVERWRITE

    Jeśli określisz OVERWRITE następujące zasady:

    • partition_spec Bez tabeli jest obcinana przed wstawieniem pierwszego wiersza.
    • W przeciwnym razie wszystkie partycje pasujące do elementu partition_spec zostaną obcięte przed wstawieniem pierwszego wiersza.

    Jeśli określisz INTO wszystkie wstawione wiersze, są dodawane do istniejących wierszy.

  • Nazwa_tabeli

    Identyfikuje tabelę do wstawienia. Nazwa nie może zawierać specyfikacji czasowej.

  • PARTITION, klauzula

    Opcjonalny parametr określający partycję docelową dla wstawiania. Można również tylko częściowo określić partycję.

  • ( column_name [, ...] )

    Opcjonalna permutacja wszystkich kolumn w tabeli. Tej klauzuli można użyć do mapowania kolumn, jeśli kolumny zwrócone przez query element nie są zgodne z naturalną kolejnością kolumny.

  • Kwerendy

    Zapytanie, które tworzy wiersze do wstawienia.

    Należy dopasować liczbę kolumn zwracanych przez zapytanie z kolumnami w tabeli z wyłączeniem partycjonowania kolumn z przypisanymi wartościami w klauzuli PARTITION .

    Jeśli typ danych nie może być bezpiecznie rzutowy do pasującego typu danych kolumny, zgłaszany jest wyjątek środowiska uruchomieniowego.

    Jeśli ewolucja schematu jest włączona, nowe kolumny mogą istnieć jako ostatnie kolumny schematu (lub kolumny zagnieżdżone), aby schemat ewoluował.

Wstawki partycji dynamicznej

W klauzuli PARTITION wartości kolumn partycji są opcjonalne. Gdy specyfikacja part_spec partycji nie jest całkowicie podana, takie wstawki są nazywane wstawianiami partycji dynamicznej lub wstawianiami z wieloma partycjami. Jeśli wartości nie zostaną określone, te kolumny są określane jako kolumny partycji dynamicznej; w przeciwnym razie są to kolumny partycji statycznej. Na przykład specyfikacja (p1 = 3, p2, p3) partycji ma kolumnę partycji statycznej (p1) i dwie kolumny partycji dynamicznej (p2 i p3).

W klauzuli PARTITION klucze partycji statycznych muszą znajdować się przed kluczami partycji dynamicznej. Oznacza to, że wszystkie kolumny partycji o wartościach stałych muszą być wyświetlane przed innymi kolumnami partycji, które nie mają przypisanej wartości stałej.

Wartości partycji kolumn partycji dynamicznej są określane podczas wykonywania. Kolumny partycji dynamicznej muszą być określone jako ostatnie w zestawie wyników wejściowych part_spec (na listach wartości wiersza lub w zapytaniu select). Są one rozpoznawane według pozycji, a nie przez nazwy. W związku z tym zamówienia muszą być dokładnie dopasowane.

Interfejsy API DataFrameWriter nie mają interfejsu służącego do określania wartości partycji. insertInto() W związku z tym interfejs API zawsze używa trybu partycji dynamicznej.

Przykłady

W tej sekcji:

INSERT INTO

Wstawianie pojedynczego wiersza przy użyciu klauzuli VALUES

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
  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

Wstawianie wielu wierszy przy użyciu klauzuli VALUES

> 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

Wstawianie przy użyciu podzapytania

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

Wstawianie przy użyciu klauzuli TABLE

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

Wstawianie do katalogu

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/mnt/user1/students";

> INSERT INTO delta.`/mnt/user1/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

Wstaw z listą kolumn

> INSERT INTO students (address, name, student_id) VALUES
    ('Hangzhou, China', 'Kent Yao', 11215016);
> SELECT * FROM students WHERE name = 'Kent Yao';
      name                address student_id
 --------- ---------------------- ----------
 Kent Yao         Hangzhou, China   11215016

Wstaw z specyfikacją partycji i listą kolumn

> INSERT INTO students PARTITION (student_id = 11215017) (address, name) VALUES
    ('Hangzhou, China', 'Kent Yao Jr.');
> SELECT * FROM students WHERE student_id = 11215017;
         name                address student_id
 ------------ ---------------------- ----------
 Kent Yao Jr.        Hangzhou, China   11215017

INSERT OVERWRITE

Wstawianie przy użyciu klauzuli VALUES

-- Assuming the students table has already been created and populated.
> 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

> INSERT OVERWRITE students VALUES
    ('Ashua Hill', '456 Erica Ct, Cupertino', 111111),
    ('Brian Reed', '723 Kern Ave, Palo Alto', 222222);

> SELECT * FROM students;
       name                 address student_id
 ---------- ----------------------- ----------
 Ashua Hill 456 Erica Ct, Cupertino     111111
 Brian Reed 723 Kern Ave, Palo Alto     222222

Wstawianie przy użyciu podzapytania

-- 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 OVERWRITE students PARTITION (student_id = 222222)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
    Ashua Hill   456 Erica Ct, Cupertino     111111
 Dora Williams 134 Forest Ave, Melo Park     222222

Wstawianie przy użyciu klauzuli TABLE

-- 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 OVERWRITE students TABLE visiting_students;

> SELECT * FROM students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

Wstaw zastępowanie katalogu

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/mnt/user1/students";

> INSERT OVERWRITE delta.`/mnt/user1/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