lección 7
Día 5 tarde - Pair programming con Sandra: tu primer modelo dbt
Sandra te pide ayuda para convertir tu query de cohortes en un modelo dbt. Aprendes dbt por primera vez de la mano de alguien que lo domina.
⏱ 30 min
### Viernes, 17:00 PM - Sandra te propone algo
Después de la demo, cuando ya pensabas que el día había terminado, Sandra te manda un DM:
1Sandra Vidal 17:02 PM2Ey, tienes 30 min antes de irte? ??3Quiero convertir tu query de cohortes en un modelo dbt4para que se ejecute automaticamente cada día.5Podemos hacerlo juntos? Asi aprendes como funciona dbt6y yo tengo el modelo listo para el lunes.7Es pair programming: yo pongo el framework de dbt,8tu pones la logica SQL. Win-win.910Tu 17:04 PM11Claro! Nunca he usado dbt pero siempre quise aprender.12Te llamo?1314Sandra Vidal 17:05 PM15Si! Te comparto pantalla y vamos pasó a pasó ??
Esto es algo que pasa en equipos reales: el viernes a las 17:00, cuando la energía está baja, alguien propone algo que te hace crecer profesionalmente. Sandra no te está pidiendo un favor -- te está ofreciendo una oportunidad de aprender dbt con alguien que lo domina. Di que sí.
Además, fíjate en cómo Sandra te lo plantea: "yo pongo el framework, tú pones la lógica SQL". Es un PAIR PROGRAMMING real: cada persona aporta lo que sabe. Ella domina dbt (config, ref, schema.yml). Tú dominas la lógica de cohortes (la query). Juntos producen algo que ninguno haría solo tan rápido. Este tipo de colaboración es lo que hace que los equipos funcionen.
### dbt en 5 minutos (la explicacion de Sandra)
1Sandra (compartiendo pantalla):23"OK, dbt en 5 minutos para alguien que ya sabe SQL:45dbt = herramienta que convierte tus queries SELECT en6tablas/vistas de forma automática, con tests, documentación7y dependencias.89En vez de hacer CREATE TABLE + INSERT INTO a mano, escribes10un archivo .sql con un SELECT y dbt se encarga del resto.1112Estructura del proyecto:13models/14 staging/ -> stg_* (limpieza básica, 1:1 con la fuente)15 intermediate/ -> int_* (joins, logica de negocio)16 marts/ -> fct_* y dim_* (tablas finales para BI)1718Cada archivo .sql es un 'modelo'. dbt resuelve las19dependencias entre modelos automaticamente: si fct_cohorts20usa int_user_activity, dbt lo ejecuta primero.2122Los tests van en un schema.yml al lado:23- not_null, unique, accepted_values24- Tests custom que tu escribas2526Eso es todo. El SQL que ya sabes escribir funciona tal cual.27Solo que lo pones en un archivo y dbt hace la magia alrededor.28Vamos?"
### Convirtiendo la query en modelo dbt
Sandra abre el repo de dbt y crea un nuevo archivo. Tu query de cohortes se convierte en un modelo de dbt con referencias explicitas a las tablas de las que depende:
1-- models/marts/fct_retention_cohorts.sql2-- Modelo dbt: cohortes de retención semanal3-- Dependencias: stg_product_events, int_user_first_activity45{{ config(6 materialized='table',7 schema='analytics_marts',8 tags=['retention', 'weekly']9) }}1011WITH user_cohorts AS (12 SELECT13 user_id,14 DATE_TRUNC('week', signup_date) AS cohort_week15 FROM {{ ref('int_user_first_activity') }}16),1718user_weekly_activity AS (19 SELECT20 user_id,21 DATE_TRUNC('week', event_timestamp) AS activity_week22 FROM {{ ref('stg_product_events') }}23 WHERE event_category = 'core'24 AND exclude_from_retention = false25 GROUP BY user_id, DATE_TRUNC('week', event_timestamp)26),2728cohort_retention AS (29 SELECT30 uc.cohort_week,31 DATEDIFF('week', uc.cohort_week, uwa.activity_week) AS weeks_since_signup,32 COUNT(DISTINCT uc.user_id) AS active_users33 FROM user_cohorts uc34 INNER JOIN user_weekly_activity uwa35 ON uc.user_id = uwa.user_id36 AND uwa.activity_week >= uc.cohort_week37 GROUP BY 1, 238),3940cohort_sizes AS (41 SELECT cohort_week, COUNT(DISTINCT user_id) AS cohort_size42 FROM user_cohorts43 GROUP BY 144)4546SELECT47 cr.cohort_week,48 cs.cohort_size,49 cr.weeks_since_signup,50 cr.active_users,51 ROUND(cr.active_users * 100.0 / cs.cohort_size, 1) AS retention_pct52FROM cohort_retention cr53JOIN cohort_sizes cs ON cr.cohort_week = cs.cohort_week54WHERE cr.weeks_since_signup BETWEEN 0 AND 12
Tu query convertida en modelo dbt: ref() para dependencias, config para materialización
Sandra te explica cada pieza: "{{ ref() }} es como un import -- le dice a dbt que este modelo depende de otro. {{ config() }} le dice cómo materializarlo (tabla, vista, incremental). El SQL es EXACTAMENTE el tuyo. dbt no inventa SQL -- lo organiza."
### Añadiendo tests y documentación
1-- models/marts/schema.yml (parcial)2versión: 234models:5 - name: fct_retention_cohorts6 description: >7 Tabla de cohortes de retención semanal. Cada fila es un8 par (cohorte, semana_desde_signup) con el número de usuarios9 activos y el porcentaje de retención.10 Definicion de activo: al menos 1 evento core.11 Vigente desde: 2024-03-14.12 columns:13 - name: cohort_week14 description: "Semana de signup de la cohorte (lunes de la semana)"15 tests:16 - not_null17 - name: cohort_size18 description: "Usuarios en la cohorte que tuvieron al menos 1 evento core en W0"19 tests:20 - not_null21 - name: weeks_since_signup22 description: "Semanas transcurridas desde el signup (0-12)"23 tests:24 - not_null25 - accepted_values:26 values: [0,1,2,3,4,5,6,7,8,9,10,11,12]27 - name: retention_pct28 description: "Porcentaje de la cohorte que sigue activa"29 tests:30 - not_null
schema.yml: documentación y tests integrados con el modelo
Sandra hace "dbt run --select fct_retention_cohorts" y la tabla se crea. Luego "dbt test --select fct_retention_cohorts" y todos los tests pasan. En 30 minutos has convertido un script manual en un modelo automatizado, testeado y documentado. Eso es dbt.
Consejo de senior: dbt no reemplaza tu SQL -- lo POTENCIA. Si ya sabes escribir queries buenas (y esta semana has demostrado que sí), dbt es solo el framework que las hace automáticas, testeables y documentadas. La curva de aprendizaje es suave si ya dominas SQL.
1Sandra Vidal 17:35 PM2Listo! El modelo corre y los tests pasan ??3El lunes lo anadimos al DAG diario. Cada mañana a las 6:004tendrá las cohortes actualizadas automaticamente.56Buen pair. La semana que viene te enseñó como hacer7modelos incrementales (que solo procesan datos nuevos en8vez de reprocesar todo). Eso va a ser clave cuando tengas9millones de eventos.1011Tu 17:37 PM12Genial Sandra, muchas gracias! dbt es más simple de lo13que pensaba. El SQL es el mismo, solo el envoltorio cambia.1415Sandra Vidal 17:38 PM16Exacto ?? Esa es la magia: no tienes que aprender un17lenguaje nuevo. Solo una forma mejor de ORGANIZAR el SQL18que ya sabes.1920Buen finde! Nos vemos el lunes para la retro.2122 ?? 1
## ejercicios
Convertir una query en modelo dbt
Convierte la query de usuarios core activos por workspace en un modelo dbt válido con config, ref() y la estructura correcta. No necesitas ejecutarlo -- solo escribir el SQL con la sintaxis dbt.
Escribir tests y documentación dbt (schema.yml)
Escribe el schema.yml para el modelo int_workspace_daily_activity. Incluye descripcion de la tabla, descripcion de cada columna y tests apropiados.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...