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.
yoDEV Tested · 29 de octubre de 2026
Probamos MiniLake 1.9.0, tanto el paquete de PyPI como la imagenghcr.io/dmux/minilake:1.9.0, condatabricks-sdk0.158.0, y ejecutamos la suite de tests completa del proyecto en el tagv1.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.tablaes 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, pordelta_scan()de DuckDB. - Los jobs ejecutan
spark-submitreal en contenedores Docker hermanos, con una planificación DAG que respetadepends_onyrun_if. - Lo que no emula responde
501 NOT_IMPLEMENTEDen 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:
- Una prueba rápida del paquete de PyPI con el SDK oficial de Python.
- 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. - 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
NotImplementedclaro.
¿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?
- Jobs de Spark y notebooks
- Despliegues con Terraform o Asset Bundles
- Tests en CI
- Prefiero otra opción (cuéntanos cuál)
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
