dbt: Qu’est-ce que le “column-level lineage” dans dbt ?

C’est la capacité de dbt à savoir quelle colonne source alimente quelle colonne cible, dans un modèle donné.

Cela permet :

  • de documenter les colonnes,
  • de voir l’impact d’un changement en amont,
  • d’avoir une vue claire dans dbt docs du flux de données colonne par colonne (et pas juste table à table).

⚠️ Problème avec SELECT *

Quand tu fais un :

select * from {{ ref('stg_ventes') }}

dbt ne peut pas deviner quelles colonnes tu as sélectionnées, ni comment elles sont transformées.

Le * est un alias : il signifie “toutes les colonnes”, mais dbt ne voit pas la liste réelle tant que ce n’est pas exécuté dans la base.
Et dbt ne devine pas dynamiquement les schémas des tables pendant la compilation.


📉 Conséquence

  • dbt ne peut pas générer la lineage par colonne
  • dans dbt docs, tu verras la relation entre les modèles, mais pas entre les colonnes
  • tu perds la possibilité de documenter et tracer les dépendances précises

✅ Bonne pratique : toujours lister explicitement les colonnes

select
    id_vente,
    produit,
    date_vente,
    montant
from {{ ref('stg_ventes') }}

Grâce à ça, dbt :

  • sait que id_vente du modèle vient de stg_ventes.id_vente
  • peut documenter chaque colonne
  • peut propager des descriptions avec le +copy_metadata: true

🧪 Exemple visuel dans dbt docs

Avec SELECT *Avec SELECT col1, col2...
fact_ventes dépend de stg_ventesfact_ventes.date_ventestg_ventes.date_vente
❌ Pas de trace colonne par colonne✅ Traçabilité précise ligne à ligne

🧼 Règle à retenir

❌ Évite SELECT * dans les modèles dbt,
✅ Préfère SELECT col1, col2, … même si c’est plus verbeux.

Leave a Reply

Your email address will not be published. Required fields are marked *