MERGE INTO (Delta Lake op Azure Databricks)

Voegt een reeks updates, invoegingen en verwijderingen op basis van een brontabel samen in een Doel-Delta-tabel.

Syntax

MERGE INTO target_table_identifier [AS target_alias]
USING source_table_identifier [<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> ]

waar

  • table_identifier

    • [database_name.] table_name: Een tabelnaam, eventueel gekwalificeerd met een databasenaam.
    • delta.`<path-to-table>`: De locatie van een bestaande Delta-tabel.
  • AS-alias

    Definieer een tabelalias.

<merge_condition> =
  How the rows from one relation are combined with the rows of another relation. An expression with a return type of Boolean.

<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
  • In Databricks Runtime 7.3 LTS en hoger:
    • Er kan een groot aantal - WHEN MATCHED en WHEN NOT MATCHED -component zijn.
    • Meerdere overeenkomsten zijn toegestaan wanneer overeenkomsten voorwaardelijke worden verwijderd (omdat het voorwaardelijke verwijderen niet ambigu is, zelfs niet als er meerdere overeenkomsten zijn).
  • In Databricks Runtime kan 7.2 en lager uit ten beste MERGE twee clausules en ten beste één component WHEN MATCHEDWHEN NOT MATCHED komen.
  • WHEN MATCHED -component wordt uitgevoerd wanneer een bronrij overeenkomt met een doeltabelrij op basis van de overeenkomstvoorwaarde. Deze component heeft de volgende semantiek.
    • WHEN MATCHED -component kan uit maar één UPDATE actie DELETE komen. Met UPDATE de actie in worden alleen de opgegeven kolommen van de merge overeenkomende doelrij bijgewerkt. Met DELETE de actie wordt de overeenkomende rij verwijderd.
    • Elke WHEN MATCHED component kan een optionele voorwaarde hebben. Als deze componentvoorwaarde bestaat, wordt de actie of alleen uitgevoerd voor een overeenkomende rij met een bron-doelrij als aan de UPDATE voorwaarde voor de component wordt DELETE uitgevoerd.
    • Als er meerdere componenten zijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven (dat wil zeggen, de WHEN MATCHED volgorde van de component is belangrijk). Alle WHEN MATCHED -componenten, met uitzondering van de laatste, moeten voorwaarden hebben.
    • Als beide componentvoorwaarden hebben en geen van de voorwaarden waar is voor een overeenkomend brondoelrijpaar, blijft de overeenkomende doelrij WHEN MATCHED ongewijzigd.
    • Gebruik om alle kolommen van de doel-Delta-tabel bij te werken met de bijbehorende kolommen van de UPDATE SET * bronset. Dit is gelijk aan UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] voor alle kolommen van de doel-Delta-tabel. Bij deze actie wordt ervan uitgenomen dat de brontabel dezelfde kolommen heeft als die in de doeltabel, anders wordt er een analysefout weergegeven.
  • WHEN NOT MATCHED -component wordt uitgevoerd wanneer een bronrij niet overeen komt met een doelrij op basis van de voorwaarde voor overeenkomst. Deze component heeft de volgende semantiek.
    • WHEN NOT MATCHED -component kan alleen de actie INSERT hebben. De nieuwe rij wordt gegenereerd op basis van de opgegeven kolom en de bijbehorende expressies. Niet alle kolommen in de doeltabel hoeven te worden opgegeven. Voor niet-gespecificeerde doelkolommen NULL wordt ingevoegd.

    • Elke WHEN NOT MATCHED component kan een optionele voorwaarde hebben. Als de componentvoorwaarde aanwezig is, wordt alleen een bronrij ingevoegd als die voorwaarde waar is voor die rij. Anders wordt de bronkolom genegeerd.

    • Als er meerdere componenten zijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven (dat wil zeggen, de WHEN NOT MATCHED volgorde van de component is belangrijk). Alle WHEN NOT MATCHED -componenten, met uitzondering van de laatste, moeten voorwaarden hebben.

    • Als u alle kolommen van de doel-Delta-tabel wilt invoegen met de bijbehorende kolommen van de bronset, gebruikt u INSERT * . Dit is gelijk aan INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) voor alle kolommen van de doel-Delta-tabel. Bij deze actie wordt ervan uitgenomen dat de brontabel dezelfde kolommen heeft als die in de doeltabel, anders wordt er een analysefout weergegeven.

      Notitie

      Dit gedrag verandert wanneer automatische schemamigratie is ingeschakeld. Zie Automatische schemaontwikkeling voor meer informatie.

Belangrijk

Een bewerking kan mislukken als meerdere rijen van de bronset overeenkomen en proberen dezelfde rijen van de MERGE doel-Delta-tabel bij te werken. Volgens de SQL van samenvoegen is een dergelijke updatebewerking ambigu omdat het onduidelijk is welke bronrij moet worden gebruikt om de overeenkomende doelrij bij te werken. U kunt de brontabel voorverwerken om de mogelijkheid van meerdere overeenkomsten weg te nemen. Zie het voorbeeld Change data capture(Gegevensopname wijzigen). De wijzigingsgegevensset (dat wil zeggen, de brongegevensset) wordt voorverwerkt, zodat alleen de meest recente wijziging voor elke sleutel wordt bewaard voordat deze wijziging wordt toegepast in de Doel-Delta-tabel.

Voorbeelden

U kunt gebruiken voor complexe bewerkingen, zoals het ontdubbelen van gegevens, het upserteren van wijzigingsgegevens, het toepassen van MERGE INTO SCD-bewerkingen van het type 2, enzovoort. Zie MERGE INTO voor enkele voorbeelden.