Cómo emular Databricks en local con MiniLake: lo probamos y esto es lo que funciona (y lo que no) ✅ yoDEV Tested

Sí, puedes desarrollar contra la API de Databricks en tu propia máquina: MiniLake 1.9.0 la emula en local con SQL real sobre DuckDB, archivos Delta Lake reales y jobs de Spark reales. Lo probamos y su suite completa pasó 406 de 406 tests. Es gratis, con licencia MIT y sin cuenta, pero la versión de PyPI tiene un bug que conviene conocer antes de instalarla.

:white_check_mark: yoDEV Tested · 29 de octubre de 2026
Probamos MiniLake 1.9.0, tanto el paquete de PyPI como la imagen ghcr.io/dmux/minilake:1.9.0, con databricks-sdk 0.158.0, y ejecutamos la suite de tests completa del proyecto en el tag v1.9.0, en un entorno Linux en la nube. Los resultados que reportamos como nuestros salen de esa prueba.

MiniLake es un proyecto de código abierto de Rafael Sales, publicado por primera vez en PyPI en julio de 2026; la versión 1.9.0 llegó allí el 25 de octubre. Lo instalamos, apuntamos el SDK oficial de Databricks para Python hacia él, ejecutamos toda la suite de tests del proyecto y buscamos los puntos en los que se aleja de lo que espera el código escrito para Databricks. Esto es lo que encontramos.

¿Qué es Databricks y qué es MiniLake?

Databricks es la plataforma de datos y analítica en la nube construida alrededor de Apache Spark y Delta Lake. Desarrollar para ella suele exigir un workspace, un token y cómputo que pagas mientras iteras. MiniLake es un emulador local de la API REST de Databricks: un solo proceso en el puerto 8000 que habla el mismo protocolo que un workspace, de modo que databricks-sdk, la CLI de Databricks, el provider de Terraform y los Asset Bundles pueden conectarse a él cambiando solo el host.

Lo que lo diferencia de un servidor mock es lo que hay detrás de la API:

  • El SQL se ejecuta en DuckDB. Cada catálogo de Unity Catalog es su propia base de datos DuckDB, así que el direccionamiento catalogo.esquema.tabla es nativo.
  • Las tablas Delta EXTERNAL son archivos reales: Parquet más un _delta_log/ en disco. Las escrituras pasan por un job de Spark generado; las lecturas, por delta_scan() de DuckDB.
  • Los jobs ejecutan spark-submit real en contenedores Docker hermanos, con una planificación DAG que respeta depends_on y run_if.
  • Lo que no emula responde 501 NOT_IMPLEMENTED en lugar de fingir que funcionó.

El proyecto declara más de 30 grupos de API emulados y un servidor MCP con 67 herramientas para agentes de IA. Esas cifras son del propio proyecto.

¿Qué es Delta Lake?

Delta Lake es el formato de tabla abierto que usa Databricks: archivos Parquet acompañados de un registro de transacciones (_delta_log/) que añade transacciones ACID, versiones e historial. Que MiniLake escriba Delta real significa que los archivos que genera en local tienen el mismo formato que los de una tabla Delta en producción.

¿MiniLake es gratis?

Sí. Tiene licencia MIT, no necesita cuenta de Databricks, ni API key, ni registro, y se ejecuta por completo en tu máquina. MiniLake no está afiliado a Databricks ni cuenta con su respaldo.

¿MiniLake o Databricks Free Edition?

No compiten: resuelven partes distintas del ciclo. Databricks Free Edition es la plataforma real, gratis pero con cuotas; MiniLake es un emulador local sin cuotas. Según la documentación de Databricks consultada el 29 de octubre de 2026 (actualizada el 18 de octubre):

MiniLake Databricks Free Edition
Dónde se ejecuta En tu máquina o en tu CI En la nube de Databricks
Cuenta No necesita Cuenta de Databricks
Uso comercial Sí (licencia MIT) No, solo uso no comercial
Dialecto SQL DuckDB Spark SQL de Databricks
Cómputo Tu hardware; Spark en contenedores Docker Solo serverless; un SQL warehouse 2X-Small
Límites Sin cuotas; un solo proceso Cuotas diarias: al superarlas, el cómputo se apaga hasta que se restablecen
Sin conexión Sí, con la imagen Docker No

En la práctica se complementan: MiniLake para el ciclo rápido y para CI, Free Edition para comprobar contra la plataforma real lo que el emulador no puede garantizar, como el dialecto SQL.

¿Cómo instalar MiniLake?

La vía más rápida es Docker, y para la versión 1.9.0 también es la que recomendamos:

docker run -p 8000:8000 ghcr.io/dmux/minilake:latest

Luego comprueba que está activo:

curl http://localhost:8000/_minilake/health

La imagen trae incorporados la extensión delta de DuckDB y los jars de Delta y Unity Catalog, así que no descarga nada al arrancar. Lo comprobamos: iniciada con --network none, la imagen 1.9.0 arrancó sana sin ninguna conexión de red.

El espacio de trabajo SQL integrado, un editor al estilo de Athena con catálogo de datos, consultas guardadas e historial, está en http://localhost:8000/ui/.

¿Y con pip?

También funciona con pip:

pip install minilake
minilake --port 8000

Pero al momento de publicar esta nota (29 de octubre de 2026), la versión 1.9.0 de PyPI tiene un bug: con el directorio de datos por defecto, todas las escrituras en DBFS y en la Files API fallan con Invalid path. La comprobación de rutas compara una ruta absoluta con el directorio relativo ./data que usa por defecto, así que siempre la rechaza. Docker no se ve afectado porque la imagen define un directorio de datos absoluto.

La solución es arrancar MiniLake con un directorio de datos absoluto:

MINILAKE_DATA_DIR="$PWD/data" minilake --port 8000

Reprodujimos el bug y la solución con el paquete de PyPI. La corrección ya está integrada en la rama principal del repositorio, donde los mismos tests pasan, pero al momento de escribir esto todavía no se había publicado en PyPI. Además, la instalación con pip descarga la extensión delta la primera vez que la necesita, así que la garantía de funcionamiento sin conexión aplica a la imagen Docker, no a pip.

Un detalle más si ya usas DuckDB 2.0: MiniLake 1.9.0 exige una versión de DuckDB anterior a la 2.0 (duckdb>=1.0,<2), por lo que instala una 1.x. Si ya migraste tus proyectos a DuckDB 2.0, instala MiniLake en su propio entorno virtual o usa Docker. Nuestra guía de migración a DuckDB 2.0 explica qué cambia entre ambas.

¿Cómo conectar el SDK de Databricks para Python a MiniLake?

Cambia el host. MiniLake acepta cualquier token:

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import ColumnInfo, TableType, DataSourceFormat

w = WorkspaceClient(host="http://localhost:8000", token="dev")

w.catalogs.create(name="sales")
w.schemas.create(name="store", catalog_name="sales")
w.tables.create(
    name="orders", catalog_name="sales", schema_name="store",
    table_type=TableType.MANAGED,
    data_source_format=DataSourceFormat.DELTA,
    storage_location="/data/sales/store/orders",
    columns=[
        ColumnInfo(name="id", type_text="BIGINT"),
        ColumnInfo(name="customer", type_text="STRING"),
        ColumnInfo(name="amount", type_text="DECIMAL(10,2)"),
    ],
)

wh = w.warehouses.create(name="dev", cluster_size="Small")
w.statement_execution.execute_statement(
    warehouse_id=wh.id,
    statement="INSERT INTO sales.store.orders VALUES (1, 'Ana', 459.90)",
)
result = w.statement_execution.execute_statement(
    warehouse_id=wh.id,
    statement="SELECT customer, amount FROM sales.store.orders",
)
print(result.result.data_array)

Hay una diferencia con el ejemplo de la web de MiniLake: data_source_format usa el enum DataSourceFormat.DELTA. La web pasa el string "DELTA", que el SDK actual (probamos databricks-sdk 0.158.0) rechaza con AttributeError: 'str' object has no attribute 'value'. Con el enum, la inserción y la consulta funcionan correctamente en unos 50 milisegundos.

Para CI, POST /_minilake/reset le da a cada test un workspace limpio sin reiniciar el contenedor, y MINILAKE_PERSIST=1 conserva el estado entre reinicios.

¿Qué probamos y qué resultados obtuvimos?

Hicimos tres pruebas el 29 de octubre de 2026:

  1. Una prueba rápida del paquete de PyPI con el SDK oficial de Python.
  2. La suite de tests completa del proyecto en el tag v1.9.0, con el propio comando de Docker Compose del proyecto. La suite usa el SDK real de Databricks, la CLI de Databricks y el provider de Terraform.
  3. La imagen Docker publicada ghcr.io/dmux/minilake:1.9.0, con y sin conexión.
Prueba Resultado
Suite de tests completa, v1.9.0 406 pasados, 0 fallidos, 0 omitidos, 3 min 56 s
Jobs de Spark reales en contenedores hermanos Pasa
INSERT, UPDATE y DELETE en Delta sobre archivos reales Pasa
Spark leyendo cat.sch.tbl mediante el protocolo de Unity Catalog Pasa
Terraform apply, plan y destroy Pasa
Imagen Docker con --network none Arranca, sana
DBFS en PyPI 1.9.0 con el directorio por defecto Falla (Invalid path)
Ejemplo de la web con el SDK actual Falla, se corrige en una línea

El proyecto afirma tener más de 378 tests que usan el SDK real; la suite que ejecutamos reúne 406.

¿MiniLake usa Spark SQL o DuckDB?

DuckDB, y es lo más importante que debes entender antes de adoptarlo. Las sentencias SQL se ejecutan en el dialecto de DuckDB, no en Spark SQL. El proyecto lo dice con claridad, y nuestra prueba mostró lo rápido que te topas con ello:

Función Dialecto Resultado en MiniLake
date_format(current_date(), 'yyyy-MM-dd') Spark SQL Error: la función no existe
nvl(NULL, 1) Spark SQL Error: la función no existe
collect_list(customer) Spark SQL Error: la función no existe
strftime(current_date, '%Y-%m-%d') DuckDB Funciona

Por eso, el SQL escrito para un SQL warehouse de Databricks a menudo necesitará traducción. El proyecto incluye en su documentación una tabla de equivalencias entre dialectos y, para los agentes, un recurso específico por esa misma razón. El código que pasa por Spark (jobs, spark.table()) es otra historia: eso sí se ejecuta en Spark real. Si buscas la comparación DuckDB vs Spark, esta es la frontera práctica: DuckDB para las sentencias SQL, Spark para los jobs.

También observamos que los manifiestos de resultados describen las columnas con el vocabulario de DuckDB: una columna declarada STRING vuelve con type_text: VARCHAR. Si tu código inspecciona el esquema de los resultados, prueba ese camino. No lo comparamos con un workspace real.

¿Qué no hace MiniLake?

Por diseño, y según su propia documentación:

  • Sin autenticación. Cualquier token funciona y hay un solo usuario. Nunca lo expongas más allá de localhost.
  • Sin control de acceso. La API de permisos es un CRUD real que siempre lo permite todo, así que un test que pasa no dice nada sobre los permisos.
  • Sin Spark en los clusters. Los clusters son una máquina de estados; el Spark real se ejecuta mediante Jobs.
  • Un solo proceso, sin alta disponibilidad. DuckDB admite un solo escritor, así que la carga concurrente se serializa.
  • Las tablas MANAGED son invisibles para Spark. Usa tablas Delta EXTERNAL cuando Spark necesite los datos.
  • No implementado: Delta Live Tables, Model Registry, Vector Search, Lakeview y Repos. Llamamos a la API de pipelines y obtuvimos un error NotImplemented claro.

¿Pueden usar MiniLake los agentes de IA como Claude Code?

Sí. MiniLake incluye un servidor MCP, desactivado por defecto:

MINILAKE_MCP=1 minilake --port 8000
claude mcp add --transport http minilake http://localhost:8000/mcp

La segunda línea lo registra en Claude Code. La ventaja es tanto de seguridad como de comodidad: un agente puede crear catálogos, cargar tablas con datos y ejecutar jobs de Spark contra un lakehouse que no puede romper y que no cuesta nada cuando se equivoca. Los tests MCP de la suite, incluida la ejecución de un script de Spark real a través de las herramientas del agente, pasaron en nuestra prueba.

¿Cuándo conviene usar MiniLake?

Encaja cuando lo que quieres acelerar es el ciclo de la API: código Python basado en databricks-sdk, módulos de Terraform, Asset Bundles, jobs de Spark, pipelines de CI que hoy necesitan un workspace y agentes a los que quieres dar libertad sin una factura en la nube.

Encaja peor cuando tu trabajo es sobre todo SQL escrito para los SQL warehouses de Databricks (por la diferencia de dialecto), o cuando necesitas validar permisos, Delta Live Tables o cualquier otra cosa de la lista de no implementados. Y es una herramienta de desarrollo, no un lugar donde ejecutar nada compartido.

Nuestro veredicto: para un emulador de una plataforma tan grande, la honestidad es la característica principal. Lo que emula se ejecutó de verdad en nuestras pruebas, y lo que no emula te lo dice en voz alta. Instálalo con Docker por ahora y ten presente la diferencia de dialecto desde la primera consulta.


¿Y tú? ¿Dónde pruebas hoy tu código de Databricks antes de llevarlo a producción?

¿Qué parte de tu trabajo con Databricks moverías primero a local?
  • Jobs de Spark y notebooks
  • Despliegues con Terraform o Asset Bundles
  • Tests en CI
  • Prefiero otra opción (cuéntanos cuál)
0 votantes

Comenta abajo o, si este artículo te llegó por correo, responde directamente al email: tu respuesta se publica aquí.

Relacionado: DuckDB 2.0: cómo migrar desde 1.4 y 1.5 sin romper tu base de datos ni tu código Python