Nu we dieper zijn gaan kijken naar dbt , komen we steeds meer speelgoed tegen waar we enthousiast van worden.

We zijn allemaal gewend aan het feit dat een tabel een statisch object is die niet meer wordt ververst. De tabel wordt gevuld op het moment dat hij tot leven wordt geroepen, samen met alle bewerkingen op de data. Zodra de tabel opnieuw wordt aangemaakt , wordt er opnieuw data opgepakt en verwerkt. Wat echter vaak wordt vergeten is dat ALLE data opgepakt en verwerkt wordt.

Het telkens opnieuw uitrekenen van aanpassingen is natuurlijk zonde van de tijd , zeker als het gaat om miljoenen rijen die elke keer weer door de molen moeten worden gehaald.

dbt heeft hier een eenvoudige macro voor in het leven geroepen : Incremental models.

Incremental models

Incremental models worden gebouwd als tabellen in het datawarehouse – de eerste keer dat een model wordt uitgevoerd, wordt de tabel gebouwd door alle rijen met brongegevens te transformeren. Bij volgende uitvoeringen transformeert dbt alleen de rijen in de brongegevens waarop je dbt laat filteren, en voegt ze toe aan de tabel die al is gebouwd (de doeltabel).

Vaak zijn de rijen waarop je filtert bij een incrementele uitvoering de rijen in de brongegevens die zijn gemaakt of bijgewerkt sinds de laatste keer dat dbt is uitgevoerd. Als zodanig wordt de model bij elke dbt-run stapsgewijs gebouwd.

Het gebruik van een incrementeel model beperkt de hoeveelheid gegevens die moet worden getransformeerd, waardoor de looptijd van uw transformaties aanzienlijk wordt verkort. Dit verbetert de warehouse prestaties en verlaagt de rekenkosten en tijd!

Eenvoud

Zonder al te diep in de materie van dbt te duiken, is het opzetten van een incremental vrij eenvoudig doordat dit een standaard macro binnen dbt is.

Als we uitgaan van de volgende begin situatie :

select *
from raw_app_data.events

Dan kunnen we deze snel aanpassen om de standaard functionaliteit van incremental models te gebruiken :

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

select *
from raw_app_data.events

{% if is_incremental() %}

  -- this filter will only be applied on an incremental run
  where event_time > (select max(event_time) from {{ this }})

{% endif %}

Wat je kunt zien is dat bovenin de code er wordt verteld dat het hier om een incremental model gaat in plaats van een table of view die staat gedeclareerd in de standaard configuratie.
Verder zien we onderin een belangrijk if statement:
Als de tabel nog niet bestaat dan zal deze volledig worden opgebouwd en berekent maar als dit niet het geval is , dan worden enkel de records verwerkt die uit de extra query komen , in ons geval degene waarbij geldt :
event_time > (select max(event_time) from {{ this }})
(overigens is {{this}} een snelle manier binnen dbt om de huidige tabel aan te geven).

Conclusie

Incremental models geven je duidelijk de optie om herberekeningen over te slaan binnen grote datasets en kunnen voor quick wins binnen je warehouse zorgen. Wees je dus bewust van de mogelijkheden en laat je niet afschrikken door eventuele macro’s binnen dbt!