Integración de DBT y Apache Spark: Guía práctica

En esta guía práctica adaptada a 2026, analizaremos cómo DBT se integra con Spark y para qué puede resultarnos útil dicha integración.

  1. ¿Qué es DBT y para qué se utiliza?
  2. Cómo integrar DBT y Spark paso a paso
    1. Requisitos del sistema
    2. Spark con Thrift JDBC/ODBC Server
    3. Cómo configurar un proyecto de DBT y Spark
    4. Definición del perfil de DBT para Spark
    5. Creación de modelos en DBT
    6. Ejemplo de modelo particionado
    7. Ejecución de DBT y Spark
  3. Casos de uso: DBT en el entorno empresarial
  4. Conclusión

¿Qué es DBT y para qué se utiliza?

DBT es un framework que nos facilita el diseño del modelado de datos a lo largo de los diferentes ciclos del mismo. DBT se usa normalmente para el modelado de datos con fines analíticos. De esta manera, utilizando DBT interponemos una capa de desarrollo que adopta un DSL muy cercano al del SQL tradicional para agilizar el desarrollo de ELT. 

Esta posibilidad, junto con su capacidad de ser transversal a diferentes almacenes de datos o Data Warehouses, son las principales virtudes que nos ofrece DBT frente al resto de alternativas.

Cómo integrar DBT y Spark paso a paso

A continuación, veremos un caso práctico de cómo utilizar Spark 3.5 como motor de las transformaciones modeladas con DBT 1.9.

Para esta actualización de 2026, utilizaremos las versiones más modernas y estables de todo el stack tecnológico.

Requisitos del sistema

Lo primero que necesitaremos es levantar el entorno adecuado para desarrollar esta POC.

  • Java (JDK) 17. Es importante tener en cuenta que Spark 3.5 requiere como mínimo esta versión de Java. Por tanto, hay que asegurarse de tener la variable JAVA_HOME configurada correctamente.
  • Python 3.11. Es la versión recomendada de Python para garantizar la compatibilidad con DBT 1.9.

Por otro lado, procedemos a descargar una versión de Spark precompilada con Hadoop 3.3:

  • spark-3.5.x-bin-hadoop3

Spark con Thrift JDBC/ODBC Server

A continuación, levantaremos el servicio de Spark utilizando Thrift JDBC/ODBC Server ejecutando el siguiente comando:

./sbin/start-thriftserver.sh --master local[*]

Con este comando, levantamos un servicio de Thrift Server en Spark en nuestra máquina local (local[*]) que, a su vez, permite ejecutar consultas SQL interactivas en Spark a través de una conexión JDBC/ODBC. El servicio levantado expone por defecto el puerto 10000 que será utilizado para conectar DBT con Spark.

Si nos conectamos mediante un IDE de desarrollo de bases de datos a la URI jdbc:hive2://localhost:10000, podremos realizar queries directamente sobre Spark, ese es el mismo principio que DBT aprovecha para poder llevar a cabo esta integración.

El proceso de modelado de base de datos es similar al de otros desarrollos con DBT, pero es importante destacar las capacidades específicas de la integración con Spark.

En primer lugar, me gustaría resaltar que permite desarrollar modelos que no solo pueden persistir en un soporte indexado tipo base de datos, sino que también se pueden almacenar en un sistema de archivos y en todos los formatos habituales (parquet, csv, orc, etc.). Esto nos brinda la flexibilidad de movernos a un paradigma de ETL, lo cual es particularmente interesante, ya que en muchas ocasiones es posible que necesitemos trabajar con un modelo de datos que no tenga soporte en un Data Warehouse.

Sin embargo, en la mayoría de las integraciones con DBT, encontramos que este último es una pieza imprescindible dentro de la arquitectura.

Cómo configurar un proyecto de DBT y Spark

En este repositorio de GitHub de Damavis podemos encontrar un código muy sencillo que nos permite levantar un entorno de DBT con las dependencias necesarias y también un proyecto simple de modelado. Por tanto, clonamos el repositorio en local y procedemos a instalar las dependencias de Python mediante Poetry. Aconsejo que se haga mediante un virtualenv. No obstante, hay que tener en cuenta gestionar las dependencias de la forma adecuada.

pip install poetry 

poetry install

Asegúrate de instalar las versiones compatibles de 1.9:

pip install dbt-core==1.9.0 dbt-spark==1.9.0
pip install "dbt-spark[PyHive]"

Es importante que la versión de dbt-core y dbt-spark coincidan en la versión menor (1.9.x). Si se mezclan distintas versiones, por ejemplo core 1.8 con Spark 1.9, pueden darse errores en la resolución de dependencias.

Definición del perfil de DBT para Spark

Una vez instaladas las dependencias, debemos crear nuestro profiles.yml, que contiene la conectividad entre DBT y el servicio de Spark abierto sobre el puerto 10000.

damavis_dbt_spark:
  target: local
  outputs:
    local:
      type: spark
      method: thrift
      host: localhost
      schema: test   # El esquema (database) donde dbt creará las tablas    
      port: 10000
      threads: 4
      connect_retries: 3 # Recomendado para evitar fallos de conexión

DBT tiene varios tipos de conexión con Spark ODBC, Thrift, Http y Session:

  • ODBC es un método que nos permite conectarnos mediante el driver de conexión SQL de Databricks.
  • Thrift nos permite conectarnos a un server de Spark como podría ser un EMR de Amazon o un HDinsight.
  • Http nos permite conectarnos a un cluster pero mediante un servicio HTTP, actualmente (v1.6) solamente se puede integrar con el cluster interactivo de Databricks.
  • Session te permite conectar con una sesión de pySpark lanzada en local.

Creación de modelos en DBT

Ya tenemos configurada la conexión entre DBT y nuestro Spark en local. Veamos ahora el código fuente. En el fichero dbt_project.yml encontramos la primera peculiaridad del desarrollo con Spark, el control sobre el formato del fichero:

name: 'damavis_dbt_spark'
version: '1.0.0'
config-version: 2

models:
 damavis_dbt_spark:
   +file_format: parquet # Recomendamos este formato o 'delta' para producción en 2026
   +location_root: /tmp/hive/damavis
   +materialized: table

En versiones anteriores del post (2023), hemos utilizado CSV. Sin embargo, para 2026, el estándar es Parquet o formatos de tabla como Delta Lake o Iceberg. En este caso, usaremos Parquet por cuestiones de eficiencia.

Ejemplo de modelo particionado

Aquí vemos que podemos especificar por defecto que nuestros modelos se persistan con un formato específico mediante file_format o que se almacena por defecto en una ruta específica location_root. DBT soporta múltiples formatos con Spark como parquet, delta, iceberg, hudi, csv, json, text, jdbc, orc, hive o libsvm.

Si ejecutamos dbt run, veremos que se crea la siguiente estructura de carpetas:

Ejecución comando dbt run para la integración de dbt y Apache Spark

Podemos observar que el esquema de metainformación como es el fichero _SUCCESS se crea cuando el stage de Spark termina correctamente.

En el modelo example_partition_model vemos algunas de las opciones de las que disponemos para persistir los datos:

{{ config(
   materialized='table',
   partition_by=['year','month'],
   file_format='parquet',
   options={'compression': 'snappy'}
   buckets= 10
) }}


select
id,
2026 as year,
01 as month,
description
from {{ ref('example_view') }}

De esta forma, podemos especificar opciones de persistencia al igual que en Spark en el método write.option("header", True).csv("path"). También podemos establecer opciones de partition_by, en nuestro caso por year y month, o la cantidad de registros por cada uno de los ficheros que se almacenan mediante la opción buckets.

Ejemplo de modelo particionado integración dbt y Apache Spark

Ejecución de DBT y Spark

Para materializar los modelos, ejecutamos el siguiente comando:

dbt run

Si todo está correcto, en la consola de DBT veremos cómo se conecta al Thrift Server y se crean las tablas. Para verificarlo, puedes comprobar si en la carpeta definida en location_root (/tmp/hive/damavis) se encuentra la estructura de directorios creada por Spark conteniendo los ficheros .parquet. Además, se genera un fichero _SUCCESS que indica que el proceso se completó correctamente.

Casos de uso: DBT en el entorno empresarial

Más allá de la parte técnica, integrar DBT con Apache Spark responde a la incipiente necesidad de las empresas que trabajan con grandes volúmenes de datos y necesitan las herramientas adecuadas para procesarlos.

En Damavis ya hemos puesto en producción esta arquitectura en distintos proyectos para cliente. Nuestra experiencia nos demuestra la enorme capacidad que ambas tecnologías poseen a la hora de resolver problemas reales.

A continuación, detallaremos algunos escenarios en los que puede aplicarse con grandes resultados.

Análisis avanzado de datos

En ocasiones, la enorme cantidad de datos generada es tan alta y el formato tan variable (JSON, parquet, csv…) que intentar almacenarlos de la «forma tradicional» es extremadamente lento y costoso.

Para este tipo de casos, Spark se puede utilizar para leer y procesar esos datos desde el almacenamiento de objetos (S3, HDFS…) mientras que DBT permite definir la transformación aplicada (limpieza, agregación…). De esta forma, los datos pueden ser consultados más fácilmente en un sistema de visualización o BI.

Optimización de costes

Definir pipelines optimizados con DBT y Spark para sustituir procesos ETL ineficientes, puede ser clave para reducir los costes de computación. Gracias a técnicas como el particionado o la ejecución incremental, es posible un ahorro considerable del presupuesto.

Conclusión

DBT nos permite desarrollar modelos dentro de un HDFS mediante el uso de Spark como motor de ejecución, permitiendo aprovechar las fortalezas de cada uno de los frameworks.

Por otro lado, DBT puede ayudarnos a modelar de una forma rápida, documentar, aliviar la curva de aprendizaje y, por último, gestionar operaciones relativamente complicadas de desarrollar en Spark como: pruebas de calidad e integridad de los datos en cada ejecución, sistemas de snapshots desde DBT, seeds, etc. Mientras que Spark, por su lado, nos permite utilizar el músculo de un cluster de Spark para tratar con una gran cantidad de datos sin necesidad de un sistema de un Datawarehouse.

La integración de DBT con Spark en 2026 sigue siendo una estrategia acertada para la gestión y transformación de datos.

Si este artículo te ha parecido interesante, te animamos a visitar la categoría Data Engineering para ver otros posts similares a este y a compartirlo en redes. ¡Hasta pronto!

Óscar García
Óscar García
Artículos: 42