Вставить

Вставка из запросов SELECT

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. Данные вставляются по порядковому номеру (упорядочению столбцов), а не по именам.

Примечание

(Дельта Lake на Azure Databricks) Если столбец имеет NOT NULL ограничение, а INSERT INTO оператор задает для столбца значение NULL , SparkException создается исключение.

OVERWRITE

Перезаписать существующие данные в таблице или секции. В противном случае добавляются новые данные.

Примеры

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

Вставка данных в таблицу или секцию из списка значений строк.

OVERWRITE

Перезаписать существующие данные в таблице или секции. В противном случае добавляются новые данные.

Примеры

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

Динамические вставки секций

В part_spec значения столбца секционирования являются необязательными. Если спецификация секции part_spec не предоставлена полностью, такие вставки называются динамическими вставками секций или вставками с несколькими разделами. Если значения не указаны, эти столбцы называются динамическими столбцами секционирования. в противном случае они являются статическими столбцами секционирования. Например, спецификация секции (p1 = 3, p2, p3) имеет статический столбец секционирования ( p1 ) и два динамических столбца секционирования ( p2 и p3 ).

В part_spec статические ключи секций должны находиться перед динамическими ключами секции. Это означает, что все столбцы секционирования, имеющие постоянные значения, должны находиться перед другими столбцами секционирования, не имеющими назначенного значения константы.

Значения секционирования столбцов динамических секций определяются во время выполнения. Столбцы динамических секций должны быть указаны последними part_spec и входным результирующим набором (из списков значений строк или запросов SELECT). Они разрешаются по положению, а не по именам. Таким же порядком должны быть точно совпадают.

Интерфейсы API Датафрамевритер не имеют интерфейса для указания значений секций. Поэтому insertInto() API всегда использует динамический режим секционирования.

Важно!

В режиме динамического секционирования входной результирующий набор может привести к созданию большого количества динамических секций и, таким образом, создать большое количество каталогов разделов.

OVERWRITE

Семантика отличается в зависимости от типа целевой таблицы.

  • Таблицы Hive SerDe: INSERT OVERWRITE не удаляет секции заранее и перезаписывает только те секции, которые содержат данные, записанные во время выполнения. Это соответствует семантике Apache Hive. Для таблиц Hive SerDe в Spark SQL учитывается конфигурация, связанная с Hive, включая hive.exec.dynamic.partition и hive.exec.dynamic.partition.mode .
  • Собственные таблицы источника данных: INSERT OVERWRITE сначала удаляет все секции, соответствующие спецификации секции (например, Partition (a = 1, b)), а затем вставляет все оставшиеся значения. Поведение таблиц собственных источников данных можно изменить так, чтобы они были совместимы с таблицами Hive SerDe, изменив конфигурацию, относящуюся к определенному сеансу, spark.sql.sources.partitionOverwriteMode на DYNAMIC . STATIC является режимом по умолчанию.

Примеры

-- 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 OVERWRITE [LOCAL] DIRECTORY [directory_path]
  USING data_source [OPTIONS (key1=val1, key2=val2, ...)]
  [AS] SELECT ... FROM ...

Вставка результатов запроса select_statement в каталог directory_path с помощью собственного формата Spark. Если указанный путь существует, он заменяется на выходные данные select_statement .

DIRECTORY

Путь к каталогу назначения вставки. Кроме того, каталог можно указать OPTIONS с помощью ключа path . Если указанный путь существует, он заменяется на выходные данные select_statement . Если LOCAL используется, каталог находится в локальной файловой системе.

USING

Формат файла, используемый для вставки. Одно из TEXT , CSV , JSON , JDBC , PARQUET , ORC , HIVE , и LIBSVM , или полное имя класса пользовательской реализации org.apache.spark.sql.sources.DataSourceRegister .

AS

Заполните целевой каталог входными данными из инструкции SELECT.

Примеры

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 OVERWRITE [LOCAL] DIRECTORY directory_path
  [ROW FORMAT row_format] [STORED AS file_format]
  [AS] select_statement

Вставьте результаты запроса select_statement в каталог directory_path с помощью Hive SerDe. Если указанный путь существует, он заменяется на выходные данные select_statement .

Примечание

Эта команда поддерживается только в том случае, если включена поддержка Hive.

DIRECTORY

Путь к каталогу назначения вставки. Если указанный путь существует, он будет заменен выходными данными select_statement . Если LOCAL используется, каталог находится в локальной файловой системе.

ROW FORMAT

Используйте SERDE предложение, чтобы указать пользовательскую SerDe для этой вставки. В противном случае используйте DELIMITED предложение для использования собственного SerDe и укажите разделитель, escape-символ, символ NULL и т. д.

STORED AS

Формат файла для этой вставки. Один из TEXTFILE , SEQUENCEFILE , RCFILE , ORC , PARQUET , и AVRO . Кроме того, можно указать собственный формат входных и выходных данных с помощью INPUTFORMAT и OUTPUTFORMAT . Только TEXTFILE , SEQUENCEFILE и RCFILE может использоваться с и ROW FORMAT SERDE TEXTFILE может использоваться с ROW FORMAT DELIMITED .

AS

Заполните целевой каталог входными данными из инструкции SELECT.

Примеры

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