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 PM
2Ey, tienes 30 min antes de irte? ??
3Quiero convertir tu query de cohortes en un modelo dbt
4para que se ejecute automaticamente cada día.
5Podemos hacerlo juntos? Asi aprendes como funciona dbt
6y yo tengo el modelo listo para el lunes.
7Es pair programming: yo pongo el framework de dbt,
8tu pones la logica SQL. Win-win.
9
10Tu 17:04 PM
11Claro! Nunca he usado dbt pero siempre quise aprender.
12Te llamo?
13
14Sandra Vidal 17:05 PM
15Si! 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):
2
3"OK, dbt en 5 minutos para alguien que ya sabe SQL:
4
5dbt = herramienta que convierte tus queries SELECT en
6tablas/vistas de forma automática, con tests, documentación
7y dependencias.
8
9En vez de hacer CREATE TABLE + INSERT INTO a mano, escribes
10un archivo .sql con un SELECT y dbt se encarga del resto.
11
12Estructura 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)
17
18Cada archivo .sql es un 'modelo'. dbt resuelve las
19dependencias entre modelos automaticamente: si fct_cohorts
20usa int_user_activity, dbt lo ejecuta primero.
21
22Los tests van en un schema.yml al lado:
23- not_null, unique, accepted_values
24- Tests custom que tu escribas
25
26Eso 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.sql
2-- Modelo dbt: cohortes de retención semanal
3-- Dependencias: stg_product_events, int_user_first_activity
4
5{{ config(
6 materialized='table',
7 schema='analytics_marts',
8 tags=['retention', 'weekly']
9) }}
10
11WITH user_cohorts AS (
12 SELECT
13 user_id,
14 DATE_TRUNC('week', signup_date) AS cohort_week
15 FROM {{ ref('int_user_first_activity') }}
16),
17
18user_weekly_activity AS (
19 SELECT
20 user_id,
21 DATE_TRUNC('week', event_timestamp) AS activity_week
22 FROM {{ ref('stg_product_events') }}
23 WHERE event_category = 'core'
24 AND exclude_from_retention = false
25 GROUP BY user_id, DATE_TRUNC('week', event_timestamp)
26),
27
28cohort_retention AS (
29 SELECT
30 uc.cohort_week,
31 DATEDIFF('week', uc.cohort_week, uwa.activity_week) AS weeks_since_signup,
32 COUNT(DISTINCT uc.user_id) AS active_users
33 FROM user_cohorts uc
34 INNER JOIN user_weekly_activity uwa
35 ON uc.user_id = uwa.user_id
36 AND uwa.activity_week >= uc.cohort_week
37 GROUP BY 1, 2
38),
39
40cohort_sizes AS (
41 SELECT cohort_week, COUNT(DISTINCT user_id) AS cohort_size
42 FROM user_cohorts
43 GROUP BY 1
44)
45
46SELECT
47 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_pct
52FROM cohort_retention cr
53JOIN cohort_sizes cs ON cr.cohort_week = cs.cohort_week
54WHERE 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: 2
3
4models:
5 - name: fct_retention_cohorts
6 description: >
7 Tabla de cohortes de retención semanal. Cada fila es un
8 par (cohorte, semana_desde_signup) con el número de usuarios
9 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_week
14 description: "Semana de signup de la cohorte (lunes de la semana)"
15 tests:
16 - not_null
17 - name: cohort_size
18 description: "Usuarios en la cohorte que tuvieron al menos 1 evento core en W0"
19 tests:
20 - not_null
21 - name: weeks_since_signup
22 description: "Semanas transcurridas desde el signup (0-12)"
23 tests:
24 - not_null
25 - accepted_values:
26 values: [0,1,2,3,4,5,6,7,8,9,10,11,12]
27 - name: retention_pct
28 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 PM
2Listo! El modelo corre y los tests pasan ??
3El lunes lo anadimos al DAG diario. Cada mañana a las 6:00
4tendrá las cohortes actualizadas automaticamente.
5
6Buen pair. La semana que viene te enseñó como hacer
7modelos incrementales (que solo procesan datos nuevos en
8vez de reprocesar todo). Eso va a ser clave cuando tengas
9millones de eventos.
10
11Tu 17:37 PM
12Genial Sandra, muchas gracias! dbt es más simple de lo
13que pensaba. El SQL es el mismo, solo el envoltorio cambia.
14
15Sandra Vidal 17:38 PM
16Exacto ?? Esa es la magia: no tienes que aprender un
17lenguaje nuevo. Solo una forma mejor de ORGANIZAR el SQL
18que ya sabes.
19
20Buen finde! Nos vemos el lunes para la retro.
21
22 ?? 1

## ejercicios

[01]

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.

Cargando editor...
[02]

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.

Cargando editor...

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...