dbt : modèles, ref, sources et tests
dbt transforme des requêtes SELECT versionnées en tables ou vues, dans le bon ordre et avec des tests. On l'emploie pour organiser la couche de transformation d'un entrepôt en ELT.
- dbt
- model
- ref
- source
- staging
- marts
- data_tests
- jinja
Syntaxe
models/├── staging/│ ├── _sources.yml déclare les tables brutes│ └── stg_commandes.sql 1 modèle = 1 SELECT└── marts/ ├── _marts.yml tests et documentation └── fct_ventes_jour.sqlDans un modèle : {{ source('nom_source', 'table') }} lit une table brute déclarée {{ ref('autre_modele') }} lit un autre modèle et crée la dépendance {{ config(materialized='table') }} view, table, incremental ou ephemeralCommandes : dbt run (construit), dbt test (teste), dbt build (les deux, dans l'ordre du graphe)Exemple
-- models/staging/_sources.ymlversion: 2sources: - name: boutique schema: brut tables: - name: commandes-- models/staging/stg_commandes.sqlselect cast(id as integer) as commande_id, lower(trim(statut)) as statut, cast(montant as numeric) as montant, cast(cree_le as date) as date_commandefrom {{ source('boutique', 'commandes') }}-- models/marts/fct_ventes_jour.sql{{ config(materialized='table') }}select date_commande, count(*) as nb_commandes, sum(montant) as cafrom {{ ref('stg_commandes') }}where statut = 'payee'group by date_commande-- models/marts/_marts.ymlversion: 2models: - name: fct_ventes_jour columns: - name: date_commande data_tests: [unique, not_null]-- dbt build --select +fct_ventes_jour-- Résultat attendu : stg_commandes est construit et testé d'abord,-- puis fct_ventes_jour, puis le test unique/not_null sur date_commande.-- Si un test échoue, dbt build saute les modèles qui en dépendent.À retenir
- La couche staging colle à la source : une table par table brute, des renommages, des conversions de types, aucune jointure. Les règles métier vivent dans les marts.
- ref() résout aussi le schéma selon l'environnement : le même code écrit dans votre schéma de développement et dans celui de production, sans modification.
- Les tests génériques unique, not_null, accepted_values et relationships couvrent l'essentiel ; un test personnalisé est une requête qui doit renvoyer zéro ligne.
- Piège : écrire le nom de la table en dur (from brut.commandes) au lieu de source() ou ref(). dbt ne voit plus la dépendance, peut construire les modèles dans le mauvais ordre et le lignage devient faux.
Voir aussi
- ETL et ELTL'ETL transforme les données avant de les charger, l'ELT les charge brutes puis les transforme en SQL dans l'entrepôt. L'ELT domine depuis que les entrepôts cloud calculent à la demande.
- Modélisation dimensionnelle : faits et dimensionsLe schéma en étoile place les mesures dans une table de faits entourée de dimensions descriptives. On le choisit pour des tableaux de bord simples à requêter et rapides à agréger.
- Qualité des données et contratsLes tests de qualité vérifient automatiquement qu'une table respecte ce qu'on attend d'elle : clés uniques, valeurs présentes, données fraîches, volume normal. On les lance à chaque chargement.
- Orchestration : planifier, surveiller, alerterOrchestrer, c'est coordonner les étapes d'un pipeline : ordre, planning, reprises et alertes. On s'en sert dès que plusieurs tâches dépendent les unes des autres et doivent finir à l'heure.