Forum Discussion

AndersASorensen's avatar
1 year ago
Solved

SCD Type 2 Using MERGE in delta

Whats the best practice when I want to both update AND insert a record into a target table in one operation ensureing atomisity?   newRecord ID, Product, Color 123, A, Blue   myTable ID, Produ...
  • nilendraFabric's avatar
    nilendraFabric
    1 year ago

    Hello AndersASorensen 

     

    give it a try

     

    from pyspark.sql.functions import *
    from delta.tables import *

    # Assuming 'target_table' is your existing Delta table
    target_table = DeltaTable.forName(spark, "target_table")

    # 'source_df' is your new data
    merge_condition = "target.natural_key = source.natural_key"

    (target_table.alias("target")
    .merge(source_df.alias("source"), merge_condition)
    .whenMatchedUpdate(set={
    "attribute1": "source.attribute1",
    "attribute2": "source.attribute2",
    "is_current": lit(True),
    "update_date": current_date()
    })
    .whenNotMatchedInsert(values={
    "natural_key": "source.natural_key",
    "attribute1": "source.attribute1",
    "attribute2": "source.attribute2",
    "is_current": lit(True),
    "update_date": current_date()
    })
    .execute())

     

     

    https://iterationinsights.com/article/implementing-a-hybrid-type-1-and-2-slowly-changing-dimension-in-fabric

     

    Hope this helps.

     

    Please accept the answer if this works. 

    Thanks