InsérerInsert

Insérer à partir de requêtes SELECTInsert 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, ...])

Insérer des données dans une table ou une partition à partir de la table de résultats d’une instruction SELECT.Insert data into a table or a partition from the result table of a select statement. Les données sont insérées par ordinal (classement des colonnes) et non par noms.Data is inserted by ordinal (ordering of columns) and not by names.

OVERWRITE

Remplacer les données existantes dans la table ou la partition.Overwrite existing data in the table or the partition. Dans le cas contraire, de nouvelles données sont ajoutées.Otherwise, new data is appended.

Notes

Dans Databricks Runtime 7,0 et versions ultérieures, INSERT prend en charge l’application et l’évolution du schéma avec Delta Lake.In Databricks Runtime 7.0 and above, INSERT supports schema enforcement and evolution with Delta Lake. Si le type de données d’une colonne ne peut pas être converti en toute sécurité vers le type de données d’une table Delta, une exception Runtime est levée.If a column’s data type cannot be safely cast to a Delta table’s data type, a runtime exception is thrown. Si l' évolution du schéma est activée, les nouvelles colonnes peuvent exister en tant que dernières colonnes de votre schéma (ou colonnes imbriquées) pour que le schéma évolue.If schema evolution is enabled, new columns can exist as the last columns of your schema (or nested columns) for the schema to evolve.

ExemplesExamples

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

Insérer des valeurs dans des tablesInsert 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, ...])

Insérer des données dans une table ou une partition à partir d’une liste de valeurs de ligne.Insert data into a table or a partition from a row value list.

OVERWRITE

Remplacer les données existantes dans la table ou la partition.Overwrite existing data in the table or the partition. Dans le cas contraire, de nouvelles données sont ajoutées.Otherwise, new data is appended.

ExemplesExamples

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

Insertions de partitions dynamiquesDynamic partition inserts

Lorsque la spécification de partition part_spec n’est pas complètement fournie, ces insertions sont appelées comme des insertions de partitions dynamiques, également appelées « insertions à plusieurs partitions ».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. Dans part_spec , les valeurs de colonne de partition sont facultatives.In part_spec, the partition column values are optional. Lorsque les valeurs ne sont pas fournies, ces colonnes sont appelées colonnes de partition dynamiques. dans le cas contraire, il s’agit de colonnes de partition statiques.When the values are not given, these columns are referred to as dynamic partition columns; otherwise, they are static partition columns. Par exemple, la spécification de partition (P1 = 3, P2, P3) a une colonne de partition statique (P1) et deux colonnes de partition dynamique (P2 et P3).For example, the partition spec (p1 = 3, p2, p3) has a static partition column (p1) and two dynamic partition columns (p2 and p3).

Dans part_spec , les clés de partition statiques doivent précéder les clés de partition dynamiques.In part_spec, the static partition keys must come before the dynamic partition keys. Cela signifie que toutes les colonnes de partition ayant des valeurs constantes doivent apparaître avant les autres colonnes de partition qui n’ont pas de valeur de constante assignée.That means, all partition columns having constant values need to appear before other partition columns that do not have an assigned constant value.

Les valeurs de partition des colonnes de partition dynamiques sont déterminées lors de l’exécution.The partition values of dynamic partition columns are determined during the execution. Les colonnes de partition dynamique doivent être spécifiées en dernier dans part_spec et dans le jeu de résultats d’entrée (des listes de valeurs de ligne ou de la requête SELECT).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). Elles sont résolues par position, et non par nom.They are resolved by position, instead of by names. Par conséquent, les commandes doivent être exactement mises en correspondance.Thus, the orders must be exactly matched.

Actuellement, les API DataFrameWriter n’ont pas d’interface pour spécifier des valeurs de partition.Currently the DataFrameWriter APIs do not have an interface to specify partition values. Par conséquent, son insertInto() API utilise toujours le mode de partition dynamique.Therefore, its insertInto() API is always using dynamic partition mode.

Important

En mode de partition dynamique, le jeu de résultats d’entrée peut entraîner un grand nombre de partitions dynamiques et générer ainsi un grand nombre de répertoires de partition.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

La sémantique est différente selon le type de la table cible.The semantics are different based on the type of the target table.

  • Tables SerDe Hive : INSERT OVERWRITE ne supprime pas les partitions avant, et remplace uniquement celles qui contiennent des données écrites au moment de l’exécution.Hive SerDe tables: INSERT OVERWRITE doesn’t delete partitions ahead, and only overwrite those partitions that have data written into it at runtime. Cela correspond à Apache Hive sémantique.This matches Apache Hive semantics. Pour les tables SerDe Hive, Spark SQL respecte la configuration Hive, y compris hive.exec.dynamic.partition et hive.exec.dynamic.partition.mode .For Hive SerDe tables, Spark SQL respects the Hive-related configuration, including hive.exec.dynamic.partition and hive.exec.dynamic.partition.mode.
  • Tables de sources de données natives : INSERT OVERWRITE supprime tout d’abord toutes les partitions qui correspondent à la spécification de partition (par exemple, partition (a = 1, b)), puis insère toutes les valeurs restantes.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. Le comportement des tables de sources de données natives peut être modifié pour être cohérent avec les tables SerDe Hive en modifiant la configuration spécifique à la session spark.sql.sources.partitionOverwriteMode sur DYNAMIC .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. Le mode par défaut est STATIC.The default mode is STATIC.

ExemplesExamples

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

Insérer des valeurs dans le répertoireInsert values into directory

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

Insérez les résultats de la requête select_statement dans un répertoire directory_path à l’aide du format natif Spark.Insert the query results of select_statement into a directory directory_path using Spark native format. Si le chemin d’accès spécifié existe, il est remplacé par la sortie de select_statement .If the specified path exists, it is replaced with the output of the select_statement.

DIRECTORY

Chemin d’accès du répertoire de destination de l’insertion.The path of the destination directory of the insert. Le répertoire peut également être spécifié dans OPTIONS à l’aide de la clé path .The directory can also be specified in OPTIONS using the key path. Si le chemin d’accès spécifié existe, il est remplacé par la sortie de select_statement .If the specified path exists, it is replaced with the output of the select_statement. Si LOCAL est utilisé, le répertoire se trouve sur le système de fichiers local.If LOCAL is used, the directory is on the local file system.

USING

Format de fichier à utiliser pour l’insertion.The file format to use for the insert. L’un des,,,,,, TEXT CSV JSON JDBC PARQUET ORC HIVE , et LIBSVM , ou un nom de classe complet d’une implémentation personnalisée de org.apache.spark.sql.sources.DataSourceRegister .One of TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, and LIBSVM, or a fully qualified class name of a custom implementation of org.apache.spark.sql.sources.DataSourceRegister.

AS

Remplissez le répertoire de destination avec les données d’entrée de l’instruction SELECT.Populate the destination directory with input data from the select statement.

ExemplesExamples

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

Insérer des valeurs dans un répertoire au format HiveInsert values into directory with Hive format

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

Insérez les résultats de la requête select_statement dans un répertoire directory_path à l’aide de Hive SerDe.Insert the query results of select_statement into a directory directory_path using Hive SerDe. Si le chemin d’accès spécifié existe, il est remplacé par la sortie de select_statement .If the specified path exists, it is replaced with the output of the select_statement.

Notes

Cette commande est prise en charge uniquement lorsque la prise en charge de Hive est activée.This command is supported only when Hive support is enabled.

DIRECTORY

Chemin d’accès du répertoire de destination de l’insertion.The path of the destination directory of the insert. Si le chemin d’accès spécifié existe, il est remplacé par la sortie de select_statement .If the specified path exists, it will be replaced with the output of the select_statement. Si LOCAL est utilisé, le répertoire se trouve sur le système de fichiers local.If LOCAL is used, the directory is on the local file system.

ROW FORMAT

Utilisez la SERDE clause pour spécifier un SerDe personnalisé pour cette insertion.Use the SERDE clause to specify a custom SerDe for this insert. Sinon, utilisez la DELIMITED clause pour utiliser le SerDe natif et spécifiez le délimiteur, le caractère d’échappement, le caractère null, etc.Otherwise, use the DELIMITED clause to use the native SerDe and specify the delimiter, escape character, null character, and so on.

STORED AS

Format de fichier de cette insertion.The file format for this insert. ,,,, TEXTFILE SEQUENCEFILE RCFILE ORC PARQUET Et AVRO .One of TEXTFILE, SEQUENCEFILE, RCFILE, ORC, PARQUET, and AVRO. Vous pouvez également spécifier votre propre format d’entrée et de sortie à l’aide INPUTFORMAT de et de OUTPUTFORMAT .Alternatively, you can specify your own input and output format through INPUTFORMAT and OUTPUTFORMAT. Seuls TEXTFILE , SEQUENCEFILE et RCFILE peuvent être utilisés avec ROW FORMAT SERDE , et ne TEXTFILE peuvent être utilisés qu’avec 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

Remplissez le répertoire de destination avec les données d’entrée de l’instruction SELECT.Populate the destination directory with input data from the select statement.

ExemplesExamples

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