INSERT INTO
Infogar nya rader i en tabell. Du anger de infogade raderna efter värde uttryck eller resultatet av en fråga.
Syntax
INSERT INTO [ TABLE ] table_identifier [ partition_spec ]
{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
Anteckning
När du INSERT INTO
har stöd för genomförandet och utvecklingen av delta tabell scheman stöds. Om en kolumns datatyp inte kan skrivas på ett säkert sätt till en data typ i en delta tabell, genereras ett körnings undantag. Om schema utveckling är aktiverat kan nya kolumner finnas som de sista kolumnerna i schemat (eller kapslade kolumner) för att schemat ska utvecklas.
Parametrar
table_identifier
[database_name.] table_name
: Ett tabell namn, eventuellt kvalificerat med ett databas namn.delta.`<path-to-table>`
: Platsen för en befintlig delta tabell.
partition_spec
En valfri parameter som anger en kommaavgränsad lista med nyckel/värde-par för partitioner.
Syntax:
PARTITION ( partition_col_name = partition_col_val [ , ... ] )
VÄRDEN ({Value | NULL} [,...]) [ , ( ... ) ]
Värdena som ska infogas. Antingen ett explicit angivet värde eller en
NULL
. Använd kommatecken för att avgränsa varje värde i satsen. Du kan ange fler än en uppsättning värden om du vill infoga flera rader.frågeterm
En fråga som producerar de rader som ska infogas. Ett av följande format:
- En
SELECT
instruktion - En
TABLE
instruktion - En
FROM
instruktion
- En
Dynamiska partitions infogningar
I part_spec
är partitionens kolumn värden valfri. Om du part_spec
inte har angett någon korrekt infogning, kallas sådana infogningar för dynamiska partitions infogningar eller infogningar med flera partitioner. När värdena inte anges kallas dessa kolumner dynamiska partitions kolumner. annars är de statiska partitions kolumner. Till exempel (p1 = 3, p2, p3)
innehåller partitionsfunktionen en statisk partitionstabell ( p1
) och två dynamiska partitions kolumner ( p2
och p3
).
I part_spec
måste statiska partitionsnyckel finnas före de dynamiska partitionernas nycklar. Det innebär att alla partitionstyper med konstanta värden måste visas innan andra diskpartitioner som inte har ett tilldelat konstantvärde.
Partitionens värden för dynamiska partitioner beräknas under körningen. Kolumnerna dynamiska partitioner måste anges sist i både part_spec
och i den angivna resultat uppsättningen (i rad värde listorna eller i urvals frågan). De löses efter position, i stället för efter namn. Därför måste orderna exakt matchas.
DataFrameWriter-API: erna har inget gränssnitt för att ange partitionsalternativ. insertInto()
API: et använder därför alltid dynamiskt partitionerings läge.
Viktigt
I dynamiskt partitionerings läge kan den angivna resultat uppsättningen resultera i ett stort antal dynamiska partitioner och genererar därmed ett stort antal partition kataloger.
OVERWRITE
Värdena som ska infogas. Antingen ett explicit angivet värde eller ett NULL-värde kan infogas. Ett kommatecken måste användas för att avgränsa varje värde i-satsen. Fler än en uppsättning värden kan anges för att infoga flera rader.
Semantiken är olika beroende på typen av mål tabell:
- Hive SerDe-tabeller:
INSERT OVERWRITE
tar inte bort partitioner i förväg och skriver bara över de partitioner som innehåller data som skrivs till den vid körning. Detta matchar Apache Hive semantik. För Hive SerDe-tabeller respekterar Spark SQL den Hive-relaterade konfigurationen, inklusivehive.exec.dynamic.partition
ochhive.exec.dynamic.partition.mode
. - Tabeller med interna data Källor:
INSERT OVERWRITE
först tar bort alla partitioner som matchar partitionsnumret (t. ex. partition (a = 1, b)) och infogar sedan alla återstående värden. Du kan ändra beteendet för interna data käll tabeller så att de överensstämmer med Hive SerDe-tabeller genom att ändra den sessionsbaserade konfigurationenspark.sql.sources.partitionOverwriteMode
tillDYNAMIC
. Standardläget ärSTATIC
.
Exempel
I det här avsnittet:
- Infoga en enskild rad med en-
VALUES
sats - Infoga flera rader med en-
VALUES
sats - Infoga med hjälp av en
SELECT
instruktion - Infoga med hjälp av en
TABLE
instruktion - Infoga med hjälp av en
FROM
instruktion
Infoga en enskild rad med en- VALUES
sats
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|
+---------+---------------------+----------+
Infoga flera rader med en- VALUES
sats
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|
+--------------+-----------------------+----------+
Infoga med hjälp av en SELECT
instruktion
-- 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|
+-------------+-------------------------+----------+
Infoga med hjälp av en TABLE
instruktion
-- 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|
+-------------+-------------------------+----------+
Infoga med hjälp av en FROM
instruktion
-- 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|
+-------------+-------------------------+----------+