Fusionner dans (Delta Lake sur Azure Databricks)

Fusionne un ensemble de mises à jour, d’insertions et de suppressions basées sur une table source dans une table Delta cible.

MERGE INTO [db_name.]target_table [AS target_alias]
USING [db_name.]source_table [<time_travel_version>] [AS source_alias]
ON <merge_condition>
[ WHEN MATCHED [ AND <condition> ] THEN <matched_action> ]
[ WHEN MATCHED [ AND <condition> ] THEN <matched_action> ]
[ WHEN NOT MATCHED [ AND <condition> ]  THEN <not_matched_action> ]

where

<matched_action>  =
  DELETE  |
  UPDATE SET *  |
  UPDATE SET column1 = value1 [, column2 = value2 ...]

<not_matched_action>  =
  INSERT *  |
  INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

<time_travel_version>  =
  TIMESTAMP AS OF timestamp_expression |
  VERSION AS OF version
  • Dans Databricks Runtime 5,5 LTS et 6. x, MERGE peut avoir au maximum 2 WHEN MATCHED clauses et au maximum 1 WHEN NOT MATCHED clause.
  • WHEN MATCHED les clauses sont exécutées lorsqu’une ligne source correspond à une ligne de table cible basée sur la condition de correspondance. Ces clauses ont la sémantique suivante.
    • WHEN MATCHED les clauses peuvent avoir au maximum UPDATE une DELETE action et. L' UPDATE action dans merge met à jour uniquement les colonnes spécifiées de la ligne cible correspondante. L' DELETE action va supprimer la ligne correspondante.
    • Chaque WHEN MATCHED clause peut avoir une condition facultative. Si cette condition de clause existe, UPDATE l' DELETE action ou est exécutée pour toute ligne de paire de lignes cible source correspondante uniquement lorsque la condition de clause a la valeur true.
    • S’il y a plusieurs WHEN MATCHED clauses, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées (autrement dit, l’ordre des clauses). Toutes les WHEN MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.
    • Si les deux WHEN MATCHED clauses comportent des conditions et qu’aucune des conditions n’est remplie pour une paire de lignes source-cible correspondante, la ligne cible correspondante reste inchangée.
    • Pour mettre à jour toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez UPDATE SET * . Cela équivaut à UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] pour toutes les colonnes de la table Delta cible. Par conséquent, cette action suppose que la table source a les mêmes colonnes que celles de la table cible, sinon la requête génère une erreur d’analyse.
  • WHEN NOT MATCHED les clauses sont exécutées lorsqu’une ligne source ne correspond à aucune ligne cible basée sur la condition de correspondance. Ces clauses ont la sémantique suivante.
    • WHEN NOT MATCHED les clauses peuvent uniquement avoir l' INSERT action. La nouvelle ligne est générée en fonction de la colonne spécifiée et des expressions correspondantes. Il n’est pas nécessaire de spécifier toutes les colonnes de la table cible. Pour les colonnes cibles non spécifiées, NULL est inséré.

      Notes

      Dans Databricks Runtime 6,5 et les versions antérieures, vous devez fournir toutes les colonnes de la table cible pour l' INSERT action.

    • Chaque WHEN NOT MATCHED clause peut avoir une condition facultative. Si la condition de clause est présente, une ligne source est insérée uniquement si cette condition est vraie pour cette ligne. Dans le cas contraire, la colonne source est ignorée.

    • S’il y a plusieurs WHEN NOT MATCHED clauses, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées (autrement dit, l’ordre des clauses). Toutes les WHEN NOT MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.

    • Pour insérer toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez INSERT * . Cela équivaut à INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) pour toutes les colonnes de la table Delta cible. Par conséquent, cette action suppose que la table source a les mêmes colonnes que celles de la table cible, sinon la requête génère une erreur d’analyse.

      Notes

      Ce comportement change lorsque la migration de schéma automatique est activée. Pour plus d’informations, consultez évolution automatique du schéma .

Important

Une MERGE opération peut échouer si plusieurs lignes du jeu de données source correspondent et tentent de mettre à jour les mêmes lignes de la table Delta cible. d’après la SQL sémantique de fusion, une telle opération de mise à jour est ambiguë car il est difficile de déterminer quelle ligne source doit être utilisée pour mettre à jour la ligne cible correspondante. Vous pouvez prétraiter la table source pour éliminer le risque de correspondances multiples. Voir l' exemple de capture de données modifiées: il prétraite le jeu de données de modification (autrement dit, le jeu de données source) pour conserver uniquement la dernière modification pour chaque clé avant d’appliquer cette modification dans la table Delta cible.

Exemples

Vous pouvez utiliser MERGE pour des opérations complexes telles que la déduplication de données, les données de modification Upsert, l’application d’opérations de type 2. Pour obtenir quelques exemples, consultez exemples de fusion .