INSERT TABLE
説明
INSERT ステートメントは、テーブルに新しい行を挿入するか、テーブル内の既存のデータを上書きします。挿入される行は、値式で指定するか、クエリの結果から取得できます。
構文
INSERT [ INTO | OVERWRITE ] [ TABLE ] table_identifier [ partition_spec ] [ ( column_list ) | [BY NAME] ]
{ VALUES ( { value | NULL } [ , ... ] ) [ , ( ... ) ] | query }
INSERT INTO [ TABLE ] table_identifier REPLACE WHERE boolean_expression query
パラメータ
-
table_identifier
データベース名でオプションで修飾できるテーブル名を指定します。
構文:
[ database_name. ] table_name -
partition_spec
パーティションのキーと値のペアをコンマ区切りリストで指定するオプションのパラメータ。パーティション指定では、型指定されたリテラル (例: date’2019-01-02’) を使用できます。
構文:
PARTITION ( partition_col_name = partition_col_val [ , ... ] ) -
column_list
table_identifier テーブルに属する列のコンマ区切りリストを指定するオプションのパラメータ。Spark は、指定された列リストに従って、入力クエリの列をテーブルスキーマに合わせて並べ替えます。
注意: 現在の動作にはいくつかの制限があります。
- 指定されたすべての列はテーブルに存在し、静的パーティション列を除くすべての列を含み、互いに重複していない必要があります。
- 列リストのサイズは、VALUES 句またはクエリからのデータのサイズと正確に一致する必要があります。
-
VALUES ( { value
|NULL } [ , … ] ) [ , ( … ) ]挿入する値を指定します。明示的に指定された値または NULL を挿入できます。句内の各値はコンマで区切る必要があります。複数の行を挿入するために、値のセットを複数指定できます。
-
boolean_expression
結果の型が
booleanに評価される任意の式を指定します。2つ以上の式は、論理演算子(AND、OR)を使用して組み合わせることができます。 -
query
挿入する行を生成するクエリ。次のいずれかの形式になります。
例
挿入 (INSERT INTO)
VALUES 句を使用した単一行挿入
CREATE TABLE students (name VARCHAR(64), address VARCHAR(64))
USING PARQUET PARTITIONED BY (student_id INT);
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|
+---------+----------------------+----------+
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|
+--------------+-----------------------+----------+
SELECT ステートメントを使用した挿入
-- Assuming the persons table has already been created and populated.
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
|Dora Williams|134 Forest Ave, Menlo 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, Menlo Park| 444444|
+-------------+--------------------------+----------+
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, Menlo Park| 444444|
+-------------+--------------------------+----------+
|Fleur Laurent| 345 Copper St, London| 777777|
+-------------+--------------------------+----------+
|Gordon Martin| 779 Lake Ave, Oxford| 888888|
+-------------+--------------------------+----------+
FROM ステートメントを使用した挿入
-- 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, student_id 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, Menlo 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|
+-------------+--------------------------+----------+
パーティション列の値に型指定された日付リテラルを使用した挿入
CREATE TABLE students (name STRING, address STRING) PARTITIONED BY (birthday DATE);
INSERT INTO students PARTITION (birthday = date'2019-01-02')
VALUES ('Amy Smith', '123 Park Ave, San Jose');
SELECT * FROM students;
+-------------+-------------------------+-----------+
| name| address| birthday|
+-------------+-------------------------+-----------+
| Amy Smith| 123 Park Ave, San Jose| 2019-01-02|
+-------------+-------------------------+-----------+
列リストを使用した挿入
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|
+---------+----------------------+----------+
パーティション指定と列リストの両方を使用した挿入
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)
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, Menlo 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|
+----------+-----------------------+----------+
SELECT ステートメントを使用した挿入
-- Assuming the persons table has already been created and populated.
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
|Dora Williams|134 Forest Ave, Menlo 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, Menlo Park| 222222|
+-------------+--------------------------+----------+
SELECT ステートメントを使用した名前による挿入
-- Assuming the persons table has already been created and populated.
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
|Dora Williams|134 Forest Ave, Menlo Park|123456789|
+-------------+--------------------------+---------+
| Eddie Davis| 245 Market St, Milpitas|345678901|
+-------------+--------------------------+---------+
-- Spark will reorder the fields of the query according to the order of the fields in the table,
-- so don't worry about the field order mismatch
INSERT INTO students PARTITION (student_id = 222222) BY NAME
SELECT address, name 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, Menlo Park| 222222|
+-------------+--------------------------+----------+
INSERT OVERWRITE students PARTITION (student_id = 222222) BY NAME
SELECT 'Unknown' as address, name FROM persons WHERE name = "Dora Williams";
SELECT * FROM students;
+-------------+--------------------------+----------+
| name| address|student_id|
+-------------+--------------------------+----------+
| Ashua Hill| 456 Erica Ct, Cupertino| 111111|
+-------------+--------------------------+----------+
|Dora Williams| Unknown| 222222|
+-------------+--------------------------+----------+
REPLACE WHERE ステートメントを使用した挿入
-- Assuming the persons and persons2 table has already been created and populated.
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
|Dora Williams|134 Forest Ave, Menlo Park|123456789|
+-------------+--------------------------+---------+
| Eddie Davis| 245 Market St, Milpitas|345678901|
+-------------+--------------------------+---------+
SELECT * FROM persons2;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
| Ashua Hill| 456 Erica Ct, Cupertino|432795921|
+-------------+--------------------------+---------+
-- in an atomic operation, 1) delete rows with ssn = 123456789 and 2) insert rows from persons2
INSERT INTO persons REPLACE WHERE ssn = 123456789 SELECT * FROM persons2;
SELECT * FROM persons;
+-------------+--------------------------+---------+
| name| address| ssn|
+-------------+--------------------------+---------+
| Eddie Davis| 245 Market St, Milpitas|345678901|
+-------------+--------------------------+---------+
| Ashua Hill| 456 Erica Ct, Cupertino|432795921|
+-------------+--------------------------+---------+
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|
+-------------+---------------------+----------+
FROM ステートメントを使用した挿入
-- 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 OVERWRITE students
FROM applicants SELECT name, address, student_id WHERE qualified = true;
SELECT * FROM students;
+-----------+-------------------------+----------+
| name| address|student_id|
+-----------+-------------------------+----------+
|Helen Davis|469 Mission St, San Diego| 999999|
+-----------+-------------------------+----------+
| Jason Wang| 908 Bird St, Saratoga| 121212|
+-----------+-------------------------+----------+
パーティション列の値に型指定された日付リテラルを使用した挿入
CREATE TABLE students (name STRING, address STRING) PARTITIONED BY (birthday DATE);
INSERT INTO students PARTITION (birthday = date'2019-01-02')
VALUES ('Amy Smith', '123 Park Ave, San Jose');
SELECT * FROM students;
+-------------+-------------------------+-----------+
| name| address| birthday|
+-------------+-------------------------+-----------+
| Amy Smith| 123 Park Ave, San Jose| 2019-01-02|
+-------------+-------------------------+-----------+
INSERT OVERWRITE students PARTITION (birthday = date'2019-01-02')
VALUES('Jason Wang', '908 Bird St, Saratoga');
SELECT * FROM students;
+-----------+-------------------------+-----------+
| name| address| birthday|
+-----------+-------------------------+-----------+
| Jason Wang| 908 Bird St, Saratoga| 2019-01-02|
+-----------+-------------------------+-----------+
列リストを使用した挿入
INSERT OVERWRITE 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|
+---------+----------------------+----------+
パーティション指定と列リストの両方を使用した挿入
INSERT OVERWRITE students PARTITION (student_id = 11215016) (address, name) VALUES
('Hangzhou, China', 'Kent Yao Jr.');
SELECT * FROM students WHERE student_id = 11215016;
+------------+----------------------+----------+
| name| address|student_id|
+------------+----------------------+----------+
|Kent Yao Jr.| Hangzhou, China| 11215016|
+------------+----------------------+----------+