挿入Insert

Select クエリからの挿入Insert from select queries

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

Select ステートメントの結果テーブルからテーブルまたはパーティションにデータを挿入します。Insert data into a table or a partition from the result table of a select statement.

OVERWRITE

テーブルまたはパーティション内の既存のデータを上書きします。Overwrite existing data in the table or the partition. それ以外の場合は、新しいデータが追加されます。Otherwise, new data is appended.

Examples

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

テーブルへの値の挿入Insert values into tables

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

行値リストからテーブルまたはパーティションにデータを挿入します。Insert data into a table or a partition from a row value list.

OVERWRITE

テーブルまたはパーティション内の既存のデータを上書きします。Overwrite existing data in the table or the partition. それ以外の場合は、新しいデータが追加されます。Otherwise, new data is appended.

Examples

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

動的パーティション挿入Dynamic partition inserts

パーティション指定 part_spec が完全に指定されていない場合、このような挿入は動的パーティション挿入として呼び出されます。これは、マルチパーティション挿入とも呼ばれます。When the partition specification part_spec is not completely provided, such inserts are called as the dynamic partition inserts, also called as multi-partition inserts. @No__t_0 では、パーティション列の値は省略可能です。In part_spec, the partition column values are optional. 値が指定されていない場合、これらの列は動的パーティション列と呼ばれます。それ以外の場合は、静的パーティション列です。When the values are not given, these columns are referred to as dynamic partition columns; otherwise, they are static partition columns. たとえば、パーティションの仕様 (p1 = 3、p2、p3) には、静的パーティション列 (p1) と2つの動的パーティション列 (p2_および_p3) があります。For example, the partition spec (p1 = 3, p2, p3) has a static partition column (p1) and two dynamic partition columns (p2 and p3).

@No__t_0 では、静的パーティションキーは動的パーティションキーの前に記述する必要があります。In part_spec, the static partition keys must come before the dynamic partition keys. つまり、定数値を持つすべてのパーティション列は、定数値が割り当てられていない他のパーティション列の前に記述する必要があります。That means, all partition columns having constant values need to appear before other partition columns that do not have an assigned constant value.

動的パーティション列のパーティション値は、実行中に決定されます。The partition values of dynamic partition columns are determined during the execution. 動的パーティション列は、part_spec と入力結果セット (行の値リストまたは選択クエリ) の両方で最後に指定する必要があります。The dynamic partition columns must be specified last in both part_spec and the input result set (of the row value lists or the select query). 名前ではなく位置によって解決されます。They are resolved by position, instead of by names. したがって、注文は正確に一致している必要があります。Thus, the orders must be exactly matched.

現在、DataFrameWriter Api には、パーティション値を指定するためのインターフェイスがありません。Currently the DataFrameWriter APIs do not have an interface to specify partition values. そのため、insertInto() API は常に動的パーティションモードを使用します。Therefore, its insertInto() API is always using dynamic partition mode.

重要

動的パーティションモードでは、入力結果セットによって多数の動的パーティションが生成され、大量のパーティションディレクトリが生成される可能性があります。In the dynamic partition mode, the input result set could result in a large number of dynamic partitions, and thus generate a large number of partition directories.

OVERWRITE

セマンティクスは、対象テーブルの型によって異なります。The semantics are different based on the type of the target table.

  • Hive SerDe テーブル: INSERT OVERWRITE は、事前にパーティションを削除するのではなく、実行時にデータが書き込まれているパーティションのみを上書きします。Hive SerDe tables: INSERT OVERWRITE doesn’t delete partitions ahead, and only overwrite those partitions that have data written into it at runtime. これは Apache Hive セマンティクスに一致します。This matches Apache Hive semantics. Hive SerDe テーブルの場合、Spark SQL は hive.exec.dynamic.partitionhive.exec.dynamic.partition.mode を含む Hive 関連の構成を尊重します。For Hive SerDe tables, Spark SQL respects the Hive-related configuration, including hive.exec.dynamic.partition and hive.exec.dynamic.partition.mode.
  • ネイティブデータソーステーブル: INSERT OVERWRITE は、まずパーティションの指定に一致するすべてのパーティション (たとえば、PARTITION (a = 1, b)) を削除し、残りのすべての値を挿入します。Native data source tables: INSERT OVERWRITE first deletes all the partitions that match the partition specification (e.g., PARTITION(a=1, b)) and then inserts all the remaining values. Databricks Runtime 3.2 以降では、セッション固有の構成 spark.sql.sources.partitionOverwriteModeDYNAMIC に変更することにより、ネイティブデータソーステーブルの動作を Hive SerDe テーブルとの一貫性を保つように変更できます。Since Databricks Runtime 3.2, the behavior of native data source tables can be changed to be consistent with Hive SerDe tables by changing the session-specific configuration spark.sql.sources.partitionOverwriteMode to DYNAMIC. 既定のモードは STATIC です。The default mode is STATIC.

Examples

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

値をディレクトリに挿入Insert values into directory

バージョンランタイム-3.3 の新バージョン。New in version runtime-3.3.

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

Spark ネイティブ形式を使用して、select_statement のクエリ結果をディレクトリ directory_path に挿入します。Insert the query results of select_statement into a directory directory_path using Spark native format. 指定されたパスが存在する場合は、select_statement の出力に置き換えられます。If the specified path exists, it is replaced with the output of the select_statement.

DIRECTORY

挿入先ディレクトリのパス。The path of the destination directory of the insert. ディレクトリは、path キーを使用して OPTIONS で指定することもできます。The directory can also be specified in OPTIONS using the key path. 指定されたパスが存在する場合は、select_statement の出力に置き換えられます。If the specified path exists, it is replaced with the output of the select_statement. @No__t_0 が使用されている場合、ディレクトリはローカルファイルシステム上にあります。If LOCAL is used, the directory is on the local file system.

USING

挿入に使用するファイル形式。The file format to use for the insert. @No__t_0、`CSV`、`JSON`、`JDBC`、`PARQUET`、`ORC`、`HIVE`、`DELTA`、`LIBSVM` のいずれか、または org.apache.spark.sql.sources.DataSourceRegister のカスタム実装の完全修飾クラス名。One of TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA, and LIBSVM, or a fully qualified class name of a custom implementation of org.apache.spark.sql.sources.DataSourceRegister.

AS

ターゲットディレクトリに、select ステートメントからの入力データを設定します。Populate the destination directory with input data from the select statement.

Examples

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

Hive 形式でディレクトリに値を挿入するInsert values into directory with Hive format

バージョンランタイム-3.3 の新バージョン。New in version runtime-3.3.

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

Hive SerDe を使用して、select_statement のクエリ結果をディレクトリ directory_path に挿入します。Insert the query results of select_statement into a directory directory_path using Hive SerDe. 指定されたパスが存在する場合は、select_statement の出力に置き換えられます。If the specified path exists, it is replaced with the output of the select_statement.

注意

このコマンドは、Hive サポートが有効になっている場合にのみサポートされます。This command is supported only when Hive support is enabled.

DIRECTORY

挿入先ディレクトリのパス。The path of the destination directory of the insert. 指定されたパスが存在する場合は、select_statement の出力に置き換えられます。If the specified path exists, it will be replaced with the output of the select_statement. @No__t_0 が使用されている場合、ディレクトリはローカルファイルシステム上にあります。If LOCAL is used, the directory is on the local file system.

ROW FORMAT

この挿入に対してカスタム SerDe を指定するには、SERDE 句を使用します。Use the SERDE clause to specify a custom SerDe for this insert. それ以外の場合は、DELIMITED 句を使用して、ネイティブ SerDe を使用し、区切り記号、エスケープ文字、null 文字などを指定します。Otherwise, use the DELIMITED clause to use the native SerDe and specify the delimiter, escape character, null character, and so on.

STORED AS

この挿入のファイル形式。The file format for this insert. @No__t_0、`SEQUENCEFILE`、`RCFILE`、`ORC`、`PARQUET`、`AVRO` のいずれか。One of TEXTFILE, SEQUENCEFILE, RCFILE, ORC, PARQUET, and AVRO. または、INPUTFORMATOUTPUTFORMAT を使用して、独自の入力形式と出力形式を指定することもできます。Alternatively, you can specify your own input and output format through INPUTFORMAT and OUTPUTFORMAT. @No__t_3 で使用できるのは TEXTFILESEQUENCEFILE、および RCFILE のみで、TEXTFILE で使用できるのは ROW FORMAT DELIMITED だけです。Only TEXTFILE, SEQUENCEFILE, and RCFILE can be used with ROW FORMAT SERDE, and only TEXTFILE can be used with ROW FORMAT DELIMITED.

AS

ターゲットディレクトリに、select ステートメントからの入力データを設定します。Populate the destination directory with input data from the select statement.

Examples

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