dbt et le lakehouse

Résumé

dbt ne stocke rien et ne calcule rien : il génère du SQL que le moteur exécute, via un adapter. Ce qu’on peut faire dépend donc du couple moteur / format de table. Le point central : la stratégie merge d’un modèle incrémental exige un format de table transactionnel (Iceberg, Delta). Sur un lac de fichiers Parquet seuls, il reste append ou insert_overwrite par partition. Les versions de dbt et le support des moteurs évoluent vite : cette note sépare les principes, stables, des statuts datés, à revérifier.

Prérequis

dbt — Fondamentaux (adapter, matérialisations, stratégie incrémentale) et Data lake vs lakehouse (format de table, catalogue).

Principes durables

Quelle stratégie incrémentale selon la couche

Entrée : un modèle incrémental, clé id.

Table cible :  (1, Alice, 30), (2, Bob, 41)
Lot du jour :  (2, Bob, 42),   (3, Chloé, 28)
ConfigurationRésultat
Lakehouse + merge(1, Alice, 30), (2, Bob, 42), (3, Chloé, 28) : 3 lignes, Bob mis à jour
Lac pur + append4 lignes, Bob en double (41 et 42)
Lac pur + insert_overwriteRéécriture de toute la partition concernée (de toute la table sans partition_by)

Avec dbt-spark, merge n’est accepté que pour Delta, Iceberg ou Hudi ; append et insert_overwrite ne dépendent pas du format (documentation dbt, configurations Spark, consultée le 24 octobre 2026).

Points d’attention sur Iceberg

  • delete+insert n’est pas toujours atomique : selon l’adapter, c’est une suppression puis une insertion en deux étapes, et la transaction multi-instructions dépend du moteur. Préférer merge.
  • Le comportement physique d’un merge (copy-on-write ou merge-on-read) est une propriété de la table, pas de dbt.
  • Les catalogues Iceberg peuvent ne pas gérer tous les objets de la même façon (les vues, un create table as atomique) ; le support varie selon le catalogue et le moteur.

Snapshots dbt et time travel : deux notions distinctes

Time travel du format de tableSnapshot dbt
Ce qu’il restitueL’état technique de la table à un instant passéL’historique de lignes capturé à chaque exécution de dbt snapshot
DuréeLimitée par la rétention des versionsAussi longue que la table de snapshot
LimiteDisparaît à l’expiration des versionsNe voit que ce qui existe quand le snapshot tourne : un changement survenu et annulé entre deux exécutions est perdu

Exemple : le client 1 passe de Toulouse à Lyon. Un snapshot dbt produit deux lignes. Les bornes dbt_valid_from et dbt_valid_to viennent de la colonne updated_at de la source (stratégie timestamp) ou de l’heure du run (stratégie check), et la dbt_valid_to de l’ancienne ligne est égale à la dbt_valid_from de la nouvelle. La question « ville du client 1 au 1er juin » trouve sa réponse dans le snapshot ; avec le seul time travel, elle disparaît dès que la version correspondante est expirée.

Orchestration et maintenance

dbt ne planifie rien et ne fait pas la maintenance du format de table. Un orchestrateur doit relancer les exécutions en cas de conflit de commit sur le catalogue, et planifier la compaction et l’expiration des snapshots (voir Maintenance d’un lakehouse).

Statuts datés, à revérifier

Données périssables

Statuts relevés dans la documentation dbt le 22 octobre 2026 (versions, dates de support, couverture des adapters). À revérifier avant toute décision : passer à la v2, catalogs.yml, DuckDB et Iceberg.

Notes liées