Au-dela des modeles de base, un Analytics Engineer Senior maitrise les macros, les packages communautaires, les snapshots pour le SCD2 et la documentation automatique.
dbt est devenu le standard de la transformation analytique. Mais connaitre SELECT ne suffit pas pour un poste Senior — on evalue la maitrise des macros, des packages et du cycle de vie complet des donnees.
Quelle est la difference entre une macro et un modele ? Quand ecrivez-vous une macro plutot qu un modele ?
-- macros/generate_date_spine.sql
{% macro generate_date_spine(start, end) %}
{{ dbt_utils.date_spine(
datepart='day',
start_date="cast('" ~ start ~ "' as date)",
end_date="cast('" ~ end ~ "' as date)"
) }}
{% endmacro %}
-- macros/get_column_values.sql
{% macro get_top_n(column, table, n=10) %}
{% set query %}
SELECT DISTINCT {{ column }}
FROM {{ ref(table) }}
ORDER BY 1
LIMIT {{ n }}
{% endset %}
{% set results = run_query(query) %}
{{ return(results.columns[0].values()) }}
{% endmacro %}# packages.yml
packages:
- package: dbt-labs/dbt_utils
version: ['>=1.0.0']
- package: calogica/dbt_expectations
version: ['>=0.10.0']
# Utilisation dans les tests YAML
models:
- name: fct_orders
columns:
- name: amount
tests:
- dbt_expectations.expect_column_values_to_be_between:
min_value: 0
max_value: 100000
- dbt_expectations.expect_column_proportion_of_unique_values_to_be_between:
min_value: 0.95Qu est-ce qu un snapshot dbt ? Comment implementez-vous un SCD de type 2 avec dbt ?
-- snapshots/snap_customers.sql
{% snapshot snap_customers %}
{{ config(
target_schema='snapshots',
unique_key='customer_id',
strategy='timestamp',
updated_at='updated_at',
invalidate_hard_deletes=True
) }}
SELECT * FROM {{ source('crm', 'customers') }}
{% endsnapshot %}
-- Colonnes ajoutees automatiquement par dbt :
-- dbt_scd_id : identifiant unique de la version
-- dbt_updated_at : date de la mise a jour
-- dbt_valid_from : date de debut de validite
-- dbt_valid_to : date de fin (NULL = version courante)# dbt_project.yml
models:
mon_projet:
marts:
+post-hook:
- 'GRANT SELECT ON {{ this }} TO ROLE analyst_role'
- '{{ log("Model " ~ this ~ " built", info=True) }}'
# on-run-start et on-run-end
on-run-start:
- 'CREATE SCHEMA IF NOT EXISTS {{ target.schema }}'
on-run-end:
- '{{ elementary.on_run_end() }}' # package de monitoring| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Modeles SQL, tests generiques, ref() et source() | Structure un projet dbt, utilise not_null/unique, sait ce que fait ref() | Ne sait pas ce que fait ref() vs une jointure directe |
| Confirme | Macros, dbt-utils, snapshots, CI/CD slim | A ecrit une macro avec run_query, utilise dbt_utils.surrogate_key, a configure un snapshot | N a jamais utilise dbt_utils, ne sait pas ce qu est un snapshot |
| Senior | Packages custom, hooks, exposures, column-level lineage, performance | A cree un package dbt interne, configure les hooks GRANT, documenté les exposures | Ne sait pas ce que sont les exposures, n a jamais optimise les performances dbt |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.