dbt - Wie lade ich inkrementell in dbt

Mit dem inkrementellem Laden in dbt werden nicht alle Datensätze sondern nur neue Datensätze geladen, wodurch der Zeit- und Ressourcenaufwand für Ihre Datentransformationen erheblich reduziert wird.

Auf dieser Seite erhalten Sie einen kurzen Überblick über inkrementelle Modelle, ihre Bedeutung bei Datentransformationen und die Kernkonzepte inkrementeller Materialisierungen in dbt.

Grundsätzliches über inkrementelles Modell

Mit inkrementellen Modellen können Sie die Ladezeit erheblich verkürzen, indem Sie nur neue Datensätze transformieren. Dies ist besonders nützlich bei großen Datenmengen, bei denen die Kosten für die Bewirtschaftung der gesamten Datenmenge hoch sind.

Inkrementelle Modelle erfordern eine zusätzliche Konfiguration und stellen eine erweiterte Nutzung von dbt dar.

Wann sollte ein inkrementelles Modell verwendet werden?

Die Erstellung von Modellen als Tabellen in Ihrem Data Warehouse wird oft bevorzugt, um die Abfrageleistung zu verbessern.

Ein inkrementelles Modell sollte verwendet werden, wenn:

  • Die Quelldaten Millionen oder Milliarden von Zeilen enthalten.
  • Datentransformationen an den Quelldaten rechenintensiv (lange Ausführungszeit) und komplex sind, z.B. bei Verwendung von Regex oder UDFs.

Inkrementelle Modelle bieten einen Kompromiss zwischen Komplexität und verbesserter Performance im Vergleich zu View- und Tabellen-Materialisierungen.

Wie kann ich ein inkrementelles Modell konfigurieren

Die Konfiguration kann so erstellt werden, dass es für alle Modelle gilt oder aber modellabhängig.

{{ config(
    materialized='incremental'
) }}

Mit dieser Konfiguration werden alle Datensätze, die durch das Modell selektiert werden in die Tabelle geschrieben (auch identische Datensätze).

Erweiterung 1: Unique Key

Mit einem Unique Key wird/werden Felder definiert, anhand deren identifiziert wird, ob der Datensatz vorhanden ist oder nicht.

Ist der Datensatz vorhanden, wird es überschrieben. Sonst wird es neu hinzugefügt.

{{ config(
    materialized='incremental',
    unique_key='Feld_1'
) }}

-- oder mit mehreren Feldern:

{{ config(
    materialized='incremental',
    unique_key=['Feld_1', 'Feld_2']
) }}

Erweiterung 2: is_incremental() Macro

Mit dem Macro is_incremental() kann geprüft werden, ob das Modell inkrementell geladen wird.

Select ...
from ...
{% if is_incremental() %}
   where load_date >= dateadd(day, -5, current_date)
{% endif %}

Das Macro liefert den Wert true, wenn:

  • Die Konfiguration materialized='incremental' enthalten ist.
  • Die Tabelle in der Datenbank bereits vorhanden ist.
  • Das Flag full-refresh nicht übergeben ist: $ dbt run --full-refresh --mein_model
Zurück zum Blog