Sesión 5
2026-09-14
Buenas practicas DBX
dbt
La tecnología detrás de Prophecy
Taller semanal · Sesión 5
Mauro Loprete
Lo que dibujás en el lienzo nunca corre tal cual: se compila dos veces antes de tocar un dato.
.prophecy/ref() y el ordenTodo lo que mergeás y todo lo que corre en producción sale de la caja naranja, no del lienzo.
Las gems con conexiones externas (Excel en SharePoint, archivos en Volumes, otras bases) no se pueden traducir a un SELECT: toman otro camino.
Pipeline lento: antes de mirar el SQL, preguntate en qué camino están sus gems. El rojo cuesta caro aunque el dato sea chico.
Los carteles que el Studio muestra mientras editás son estas mismas etapas, contadas en vivo:
Un diff típico de Prophecy: seis archivos que nadie escribió a mano.
Todo esto corre en producción igual que el código escrito a mano, y la PR es el único filtro antes de que corra.
Prophecy no inventa un formato propio: comitea un proyecto dbt estándar más la metadata del lienzo.
Meta de hoy: que cada archivo del diff te diga qué es. La próxima sesión: qué preguntarle a cada uno, con un diff de ejemplo por cada color.
dbt viene de data build tool, y va en minúscula. La idea completa:
Cada transformación es un SELECT versionado en git. dbt lo convierte en tabla o vista, en el orden correcto, con tests.
| Pieza | Quién se ocupa |
|---|---|
La lógica: un SELECT por modelo |
Vos, o Prophecy por vos |
El DDL: CREATE TABLE AS, MERGE |
dbt lo escribe |
| El orden de ejecución | dbt lo deduce de los ref() |
| Tests y documentación | Los declarás en YAML, dbt los corre |
dbt run a mano, pero los logs hablan este idioma:| Comando | Qué hace |
|---|---|
dbt run |
Construye los modelos: crea las tablas y vistas |
dbt test |
Corre los tests declarados en los YAML |
dbt build |
run + test, en orden de dependencias |
dbt compile |
Genera el SQL final sin ejecutar nada (protagonista de la sesión 6) |
dbt deps |
Instala los paquetes de packages.yml |
La regla: si el dato no se alcanza con un
SELECTdesde el warehouse, no es un problema de dbt. Es un problema de ingesta.
dbt-databricks es el adapter: el paquete que traduce lo que dbt quiere hacer al dialecto y las APIs de Databricks. La conexión vive en profiles.yml:
target apunta a un catálogo y esquema de Unity Catalog: eso decide dónde caen los modelos, y es lo que separa dev de prod1
Lo que ves en el diff
models: fija defaults en cascada: todo staging/ sale como vista, todo marts/ como tabla. El + marca que es una configvars: define valores globales (ya llegamos)En una PR, una línea cambiada acá puede cambiar la materialización de cuarenta modelos. Pesa más que cualquier diff de un modelo suelto.
mov_diarios.sql crea catalogo.esquema.mov_diariosSELECT: el CREATE TABLE AS lo escribe dbt. Si ves DDL a mano en un modelo, algo anda malmaterialized decide qué se crea: view (default), table, o incremental (tema de una próxima sesión)config() ya lo vimos en la sesión 4: ahí declaramos liquid_clustered_byUna tabla = un modelo = un dueño. dbt reconstruye la tabla entera desde su
SELECTen cada corrida: por eso dos pipelines no pueden escribir la misma tabla, el segundo pisaría al primero.
catalogo.esquema.tabla según el ambiente: el mismo modelo lee de dev en dev y de prod en prodsource('core', 'movimientos') va a buscarfreshness: dbt source freshness avisa si la fuente lleva más de 24 horas sin datos nuevosUna source nueva en el diff es una dependencia externa nueva: ¿quién carga esa tabla? ¿tiene dueño?
2
Variables, macros y paquetes
Jinja es un motor de plantillas: texto con huecos que se rellenan al compilar. dbt lo usa arriba del SQL.
Compilado contra dev, queda:
{ ... } imprime un valor; {% ... %} es control de flujo: if, fortarget trae los datos del ambiente contra el que corrés: por eso el LIMIT existe solo fuera de prodvar("nombre", "default"): el segundo argumento evita el error si nadie la definiódbt_project.ymlEn la PR: si un modelo trae un valor mágico (una fecha, un umbral suelto), la pregunta es si debería ser una var.
generate_schema_name, que decide en qué esquema cae cada modelo. No se borra ni se toca sin charla previaEn la PR: un diff en
macros/alcanza a todos los modelos que la llaman. El radio de impacto no es el archivo, es el proyecto.
requirements.txt: dbt deps las instala en dbt_packages/dbt_utils es el paquete estrella: tests genéricos y macros que evitan reinventar (deduplicación, pivots, comparar esquemas)dbt_packages/ es código de terceros: no se revisa, no se edita, y no debería estar comiteadoEn la PR: ¿la versión está fijada? Un paquete sin versión fija es un deploy distinto cada vez que corre
dbt deps.
dbt-databricks: dialecto y APIsmacros/) y las que traen los paquetes de packages.ymldbt-databricks de profiles.yml, el que traduce al dialecto y las APIs de DatabricksNingún dato pasa por dbt: el modelo termina siendo SQL final, y ese SQL entra al warehouse por el enchufe del adapter.
Para la próxima sesión, traé los hallazgos de los puntos 1 y 2.
Próxima sesión
La PR, a fondo
Un diff de ejemplo por cada tipo de archivo, el Job que corre en producción, el checklist completo y revisión de PRs reales del equipo
¿Preguntas? · Mauro Loprete
# 1. Entorno de Python (3.9+)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 2. El adapter trae dbt Core adentro: una sola instalación
pip install dbt-databricks
dbt --version
# 3. Credenciales en ~/.dbt/profiles.yml (el de la slide del adapter)
# 4. Probar contra el proyecto clonado
dbt debug # valida Python, profiles y conexión
dbt deps # instala los paquetes de packages.yml
dbt compile # compila todo sin ejecutar nadahost y http_path salen de Connection details del SQL warehouse; el token es un token personal de Databricksdbt debug primero, siempre: valida la conexión antes de intentar cualquier otra cosadbt compile andando llegás con ventaja a la próxima sesión, que lo usa en vivo
Buenas prácticas