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

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, inklusive hive.exec.dynamic.partition och hive.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 konfigurationen spark.sql.sources.partitionOverwriteMode till DYNAMIC . Standardläget är STATIC.

Exempel

I det här avsnittet:

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