Objetivo
Elegir view/table/incremental según coste y uso.
Explicación
view recalcula al consultar; table se reconstruye al ejecutar; incremental procesa subconjuntos. El incremental necesita unique_key y lógica que considere cambios tardíos. dbt aporta valor cuando las transformaciones dejan de ser consultas sueltas y pasan a formar un DAG versionado, testeable y documentado. En trabajo real tendrás que justificar dependencias, contratos de datos y cómo despliegas cambios sin romper modelos downstream. Un modelo incremental correcto debe producir el mismo estado lógico que un full refresh, incluso tras reejecuciones y datos tardíos. El ahorro de tiempo no justifica sacrificar exactitud; por eso compararás ambos modos y documentarás la clave/ventana incremental. Para trabajar Materializaciones e incremental models de forma profesional, no te quedes con el ejemplo: identifica la entrada, ejecuta el caso base, provoca al menos un caso incorrecto y compara el resultado con un control independiente. En este laboratorio el criterio de salida es concreto: Identificas el trade-off entre coste y cobertura de late data. La verificación principal será: Ejecuta dos veces y comprueba unicidad/total. Si no puedes explicar por qué pasa esa comprobación, vuelve al paso anterior antes de continuar.
Contexto profesional
dbt aporta valor cuando las transformaciones dejan de ser consultas sueltas y pasan a formar un DAG versionado, testeable y documentado. En trabajo real tendrás que justificar dependencias, contratos de datos y cómo despliegas cambios sin romper modelos downstream. Un modelo incremental correcto debe producir el mismo estado lógico que un full refresh, incluso tras reejecuciones y datos tardíos. El ahorro de tiempo no justifica sacrificar exactitud; por eso compararás ambos modos y documentarás la clave/ventana incremental.
Ejemplo real
{{ config(materialized='incremental', unique_key='order_id') }}
select * from {{ ref('stg_orders') }}
{% if is_incremental() %} where updated_at >= (select dateadd(day,-2,max(updated_at)) from {{ this }}) {% endif %}
Archivos o datos de entrada
- dbt/dbt_project.yml
- dbt/models/staging/stg_orders.sql
Práctica guiada
Convierte un modelo de pedidos en incremental conceptual.
Laboratorio paso a paso
- Prepara el entorno y localiza los datos/archivos de entrada: dbt/dbt_project.yml, dbt/models/staging/stg_orders.sql. Antes de modificar nada, anota el número de filas, columnas u objetos que esperas usar.
- Reproduce el ejemplo real de la lección y guarda la salida. No avances hasta poder explicar qué hace cada bloque relacionado con «Materializaciones e incremental models».
- Ejecuta la práctica guiada: Convierte un modelo de pedidos en incremental conceptual. Documenta el comando, consulta o acción exacta y el resultado obtenido.
- Resuelve el reto sin mirar la solución: Explica qué pasaría con un update de hace 5 días usando ventana de 2 días. Si falla, registra el mensaje de error y formula una hipótesis antes de cambiar código.
- Compara tu resultado con el criterio esperado: Identificas el trade-off entre coste y cobertura de late data. Después ejecuta la comprobación: Ejecuta dos veces y comprueba unicidad/total.
- Provoca deliberadamente un caso problemático relacionado con este error frecuente: Incremental rápido pero incorrecto es peor que full refresh correcto.. Comprueba que sabes detectarlo y corregirlo.
Reto sin ayuda
Explica qué pasaría con un update de hace 5 días usando ventana de 2 días.
Resultado esperado
Identificas el trade-off entre coste y cobertura de late data.
Cómo verificarlo
Ejecuta dos veces y comprueba unicidad/total.
Checklist de validación
- El resultado cumple: Identificas el trade-off entre coste y cobertura de late data.
- Has ejecutado esta verificación y puedes explicar el resultado: Ejecuta dos veces y comprueba unicidad/total.
- Has probado al menos un caso límite o dato inválido y el comportamiento es explícito, no silencioso.
- Puedes repetir la práctica desde cero sin copiar la solución y dejar evidencia (consulta, commit, captura o salida de consola).
Pista específica
No asumas que updated_at siempre llega en orden.
Solución paso a paso
1) Empieza reproduciendo el caso base con los datos indicados. 2) Aplica esta estrategia específica: Ajusta ventana o usa estrategia MERGE/CDC según SLA. 3) Usa como referencia técnica el ejemplo de la lección ({{ config(materialized=’incremental’, unique_key=’order_id’) }} select * from {{ ref(‘stg_orders’) }} {% if is_incremental() %} where updated_at >= (select dateadd(day,-2,max(updated_at)) from {{ this }}) {% endif %}). 4) Ejecuta la verificación: Ejecuta dos veces y comprueba unicidad/total. 5) Compara con el resultado esperado: Identificas el trade-off entre coste y cobertura de late data. 6) Repite el reto cambiando un dato o condición para demostrar que entiendes el comportamiento y no has obtenido el resultado por casualidad. Si aparece el error «Incremental rápido pero incorrecto es peor que full refresh correcto.», corrige la causa antes de continuar; no ocultes el fallo ni cambies el resultado esperado para que la prueba pase.
Errores frecuentes
- Incremental rápido pero incorrecto es peor que full refresh correcto.
Qué debes recordar
dbt debe hacer explícitas dependencias, tests y documentación de tus transformaciones.
Preguntas de entrevista
- ¿Qué test o contrato añadirías a este modelo y por qué? Aplícalo concretamente a «Materializaciones e incremental models».
- ¿Cómo comprobarías que el cambio no rompe modelos downstream? Explica qué evidencia enseñarías al revisor.
Siguiente paso
Cerrarás con documentación y CI.
Recursos de esta lección
Preparando contenido…
Quiz de la lección
¿Qué necesita normalmente un incremental para actualizar registros existentes?