Merge Into (Delta Lake az Azure Databricksben)

Frissítések, beszúrások és törlések egyesítése egy forrástáblán alapuló cél Delta-táblával.

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

ahol

<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
  • Az Databricks Runtime 5.5 LTS és 6.x alatt a záradékok legalább 2, de 1 záradékot MERGEWHEN MATCHED is WHEN NOT MATCHED tartalmaznak.
  • WHEN MATCHED A záradékok akkor vannak végrehajtva, ha a forrássor megfelel egy céltábla sorának az egyezés feltétele alapján. Ezek a záradékok a következő szemantikával stb.
    • WHEN MATCHED A záradékok és műveleteik a legtöbb UPDATEDELETE esetben. A UPDATE művelete merge csak az egyező célsor megadott oszlopait frissíti. A DELETE művelet törli az egyező sort.
    • Minden WHEN MATCHED záradékhoz választható feltétel is lehet. Ha ez a záradékfeltétel létezik, a vagy a művelet csak akkor lesz végrehajtva bármely egyező UPDATE forrás-cél sorpár sorra, ha a DELETE záradékfeltétel igaz.
    • Ha több záradék van, akkor a rendszer a megadott sorrendben értékeli ki őket (tehát a záradékok WHEN MATCHED sorrendje számít). Az utolsó kivételével minden záradéknak WHEN MATCHED feltételekkel kell lennie.
    • Ha mindkét záradék feltételekkel és egyik feltétel sem igaz a forrás-cél sorpárra, akkor az egyező célsor WHEN MATCHED változatlan marad.
    • A cél Delta-tábla összes oszlopának a forrásadatkészlet megfelelő oszlopokkal való frissítéséhez használja a következőt: UPDATE SET * . Ez egyenértékű a cél UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] Delta-tábla összes oszlopával. Ezért ez a művelet feltételezi, hogy a forrástáblában ugyanazok az oszlopok vannak, mint a céltáblában, ellenkező esetben a lekérdezés elemzési hibát ad vissza.
  • WHEN NOT MATCHED A záradékok akkor vannak végrehajtva, ha a forrássor nem egyezik meg egyetlen célsorral sem az egyező feltétel alapján. Ezek a záradékok a következő szemantikával stb.
    • WHEN NOT MATCHED A záradékok csak a műveletre INSERT vonatkozóak. Az új sor a megadott oszlop és a megfelelő kifejezések alapján jön létre. A céltábla összes oszlopát nem kell megadni. A nem meghatározott céloszlopok NULL be lesznek szúrva.

      Megjegyzés

      A Databricks Runtime 6.5-ös és az alábbi táblázatban meg kell adnia a művelethez a céltábla összes INSERT oszlopát.

    • Minden WHEN NOT MATCHED záradékhoz választható feltétel is lehet. Ha a záradék feltétele teljesül, a forrássor csak akkor lesz beszúrva, ha ez a feltétel igaz a sorra. Ellenkező esetben a forrásoszlop figyelmen kívül lesz hagyva.

    • Ha több záradék van, akkor a rendszer a megadott sorrendben értékeli ki őket (tehát a záradékok WHEN NOT MATCHED sorrendje számít). Az utolsó kivételével minden záradéknak WHEN NOT MATCHED feltételekkel kell lennie.

    • A cél Delta-tábla összes oszlopának a forrásadatkészlet megfelelő oszlopaiba való beszúrásához használja a következőt: INSERT * . Ez egyenértékű a cél INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) Delta-tábla összes oszlopával. Ezért ez a művelet feltételezi, hogy a forrástáblában ugyanazok az oszlopok vannak, mint a céltáblában, ellenkező esetben a lekérdezés elemzési hibát ad vissza.

      Megjegyzés

      Ez a viselkedés megváltozik, ha az automatikus sémaáttelepítés engedélyezve van. A részletekért lásd: Az automatikus sémafejledő funkció.

Fontos

Egy művelet meghiúsulhat, ha a forrásadatkészlet több sora egyezik, és megkísérli frissíteni a MERGE cél Delta-tábla ugyanezeket a sorait. Az egyesítés SQL szemantikája alapján az ilyen frissítési műveletek nem egyértelműek, mivel nem egyértelmű, hogy melyik forrássort kell használni az egyező célsor frissítéséhez. A forrástábla előfeldolgozásával kiküszöbölheti a több egyezés lehetőségét. Tekintse megaz Adatváltozás-rögzítési példát – a változásadatkészlet (vagyis a forrásadatkészlet) előfeldolgozásával megőrzi az egyes kulcsok legutóbbi változását, mielőtt alkalmazza a változást a cél Delta-táblára.

Példák

Az összetett műveletekhez, például az adatok deduplikációjához, a módosítási adatok frissítéséhez és a MERGE 2. típusú SCD-műveletek alkalmazáshoz használhatja a parancsot. Néhány példa: Példák egyesítése.