Como emular Databricks localmente com MiniLake: testamos e isto é o que funciona (e o que não funciona) ✅ yoDEV Tested

Sim, você pode desenvolver usando a API do Databricks em sua própria máquina: o MiniLake 1.9.0 a emula localmente com SQL real no DuckDB, arquivos Delta Lake reais e jobs Spark reais. Nós o testamos e seu conjunto completo passou em 406 de 406 testes. É gratuito, licenciado sob a licença MIT e não requer uma conta, mas a versão do PyPI tem um bug que você deve conhecer antes de instalá-la.

:white_check_mark: yoDEV Testado · 29 de outubro de 2026
Testamos o MiniLake 1.9.0, tanto o pacote do PyPI quanto a imagem ghcr.io/dmux/minilake:1.9.0, com databricks-sdk 0.158.0, e executamos a suite completa de testes do projeto na tag v1.9.0, em um ambiente Linux na nuvem. Os resultados que reportamos como nossos saem desse teste.

MiniLake é um projeto de código aberto de Rafael Sales, publicado pela primeira vez no PyPI em julho de 2026; a versão 1.9.0 chegou lá em 25 de outubro. O instalamos, apontamos o SDK oficial do Databricks para Python para ele, executamos toda a suite de testes do projeto e procuramos os pontos em que se afasta do que espera o código escrito para Databricks. Isto é o que encontramos.

O que é Databricks e o que é MiniLake?

Databricks é a plataforma de dados e análise na nuvem construída em torno do Apache Spark e Delta Lake. Desenvolver para ela normalmente exige um workspace, um token e computação que você paga enquanto itera. MiniLake é um emulador local da API REST do Databricks: um único processo na porta 8000 que fala o mesmo protocolo que um workspace, de modo que databricks-sdk, a CLI do Databricks, o provider do Terraform e os Asset Bundles podem se conectar a ele mudando apenas o host.

O que o diferencia de um servidor mock é o que há por trás da API:

  • O SQL é executado no DuckDB. Cada catálogo do Unity Catalog é seu próprio banco de dados DuckDB, então o endereçamento catalogo.schema.tabela é nativo.
  • As tabelas Delta EXTERNAL são arquivos reais: Parquet mais um _delta_log/ no disco. As escritas passam por um job do Spark gerado; as leituras, por delta_scan() do DuckDB.
  • Os jobs executam spark-submit real em contêineres Docker irmãos, com um agendamento DAG que respeita depends_on e run_if.
  • O que não emula responde 501 NOT_IMPLEMENTED em vez de fingir que funcionou.

O projeto declara mais de 30 grupos de API emulados e um servidor MCP com 67 ferramentas para agentes de IA. Essas cifras são do próprio projeto.

O que é Delta Lake?

Delta Lake é o formato de tabela aberto que o Databricks usa: arquivos Parquet acompanhados de um registro de transações (_delta_log/) que adiciona transações ACID, versões e histórico. O fato de MiniLake escrever Delta real significa que os arquivos que gera localmente têm o mesmo formato que os de uma tabela Delta em produção.

MiniLake é gratuito?

Sim. Tem licença MIT, não precisa de conta do Databricks, nem API key, nem registro, e é executado completamente em sua máquina. MiniLake não é afiliado ao Databricks nem conta com seu apoio.

MiniLake ou Databricks Free Edition?

Não competem: resolvem partes distintas do ciclo. Databricks Free Edition é a plataforma real, gratuita mas com quotas; MiniLake é um emulador local sem quotas. De acordo com a documentação do Databricks consultada em 29 de outubro de 2026 (atualizada em 18 de outubro):

MiniLake Databricks Free Edition
Onde é executado Em sua máquina ou em sua CI Na nuvem do Databricks
Conta Não precisa Conta do Databricks
Uso comercial Sim (licença MIT) Não, apenas uso não comercial
Dialeto SQL DuckDB Spark SQL do Databricks
Computação Seu hardware; Spark em contêineres Docker Apenas serverless; um SQL warehouse 2X-Small
Limites Sem quotas; um único processo Quotas diárias: ao superá-las, a computação desliga até que se restabeleçam
Offline Sim, com a imagem Docker Não

Na prática se complementam: MiniLake para o ciclo rápido e para CI, Free Edition para verificar contra a plataforma real o que o emulador não pode garantir, como o dialeto SQL.

Como instalar MiniLake?

A via mais rápida é Docker, e para a versão 1.9.0 também é a que recomendamos:

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

Depois verifique se está ativo:

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

A imagem traz incorporados a extensão delta do DuckDB e os jars do Delta e Unity Catalog, então não baixa nada ao iniciar. Verificamos: iniciada com --network none, a imagem 1.9.0 iniciou saudável sem nenhuma conexão de rede.

O espaço de trabalho SQL integrado, um editor no estilo de Athena com catálogo de dados, consultas salvas e histórico, está em http://localhost:8000/ui/.

E com pip?

Também funciona com pip:

pip install minilake
minilake --port 8000

Mas no momento de publicar esta nota (29 de outubro de 2026), a versão 1.9.0 do PyPI tem um bug: com o diretório de dados padrão, todas as escritas em DBFS e na Files API falham com Invalid path. A verificação de caminhos compara um caminho absoluto com o diretório relativo ./data que usa por padrão, então sempre o rejeita. Docker não é afetado porque a imagem define um diretório de dados absoluto.

A solução é iniciar MiniLake com um diretório de dados absoluto:

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

Reproduzi o bug e a solução com o pacote do PyPI. A correção já está integrada na branch principal do repositório, onde os mesmos testes passam, mas no momento de escrever isto ainda não havia sido publicada no PyPI. Além disso, a instalação com pip baixa a extensão delta na primeira vez que a precisa, então a garantia de funcionamento offline se aplica à imagem Docker, não a pip.

Um detalhe a mais se você já usa DuckDB 2.0: MiniLake 1.9.0 exige uma versão do DuckDB anterior à 2.0 (duckdb>=1.0,<2), então instala uma 1.x. Se você já migrou seus projetos para DuckDB 2.0, instale MiniLake em seu próprio ambiente virtual ou use Docker. Nosso guia de migração para DuckDB 2.0 explica o que muda entre ambas.

Como conectar o SDK do Databricks para Python ao MiniLake?

Mude o host. MiniLake aceita qualquer 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)

Há uma diferença com o exemplo do site do MiniLake: data_source_format usa o enum DataSourceFormat.DELTA. O site passa a string "DELTA", que o SDK atual (testamos databricks-sdk 0.158.0) rejeita com AttributeError: 'str' object has no attribute 'value'. Com o enum, a inserção e a consulta funcionam corretamente em cerca de 50 milissegundos.

Para CI, POST /_minilake/reset dá a cada teste um workspace limpo sem reiniciar o contêiner, e MINILAKE_PERSIST=1 preserva o estado entre reinícios.

O que testamos e quais resultados obtivemos?

Fizemos três testes em 29 de outubro de 2026:

  1. Um teste rápido do pacote do PyPI com o SDK oficial de Python.
  2. A suite completa de testes do projeto na tag v1.9.0, com o próprio comando do Docker Compose do projeto. A suite usa o SDK real do Databricks, a CLI do Databricks e o provider do Terraform.
  3. A imagem Docker publicada ghcr.io/dmux/minilake:1.9.0, com e sem conexão.
Teste Resultado
Suite completa de testes, v1.9.0 406 aprovados, 0 falhados, 0 ignorados, 3 min 56 s
Jobs do Spark reais em contêineres irmãos Aprova
INSERT, UPDATE e DELETE no Delta sobre arquivos reais Aprova
Spark lendo cat.sch.tbl através do protocolo do Unity Catalog Aprova
Terraform apply, plan e destroy Aprova
Imagem Docker com --network none Inicia, saudável
DBFS em PyPI 1.9.0 com o diretório padrão Falha (Invalid path)
Exemplo do site com o SDK atual Falha, se corrige em uma linha

O projeto afirma ter mais de 378 testes que usam o SDK real; a suite que executamos reúne 406.

MiniLake usa Spark SQL ou DuckDB?

DuckDB, e é o mais importante que você deve entender antes de adotá-lo. As instruções SQL são executadas no dialeto do DuckDB, não em Spark SQL. O projeto o diz com clareza, e nosso teste mostrou o rápido que você se depara com isto:

Função Dialeto Resultado em MiniLake
date_format(current_date(), 'yyyy-MM-dd') Spark SQL Erro: a função não existe
nvl(NULL, 1) Spark SQL Erro: a função não existe
collect_list(customer) Spark SQL Erro: a função não existe
strftime(current_date, '%Y-%m-%d') DuckDB Funciona

Por isso, o SQL escrito para um SQL warehouse do Databricks frequentemente precisará de tradução. O projeto inclui em sua documentação uma tabela de equivalências entre dialetos e, para os agentes, um recurso específico pela mesma razão. O código que passa pelo Spark (jobs, spark.table()) é outra história: isso sim é executado em Spark real. Se você busca a comparação DuckDB vs Spark, esta é a fronteira prática: DuckDB para as instruções SQL, Spark para os jobs.

Também observamos que os manifestos de resultados descrevem as colunas com o vocabulário do DuckDB: uma coluna declarada STRING volta com type_text: VARCHAR. Se seu código inspeciona o esquema dos resultados, teste esse caminho. Não o comparamos com um workspace real.

O que MiniLake não faz?

Por design, e de acordo com sua própria documentação:

  • Sem autenticação. Qualquer token funciona e há um único usuário. Nunca o exponha além de localhost.
  • Sem controle de acesso. A API de permissões é um CRUD real que sempre permite tudo, então um teste que aprova não diz nada sobre as permissões.
  • Sem Spark nos clusters. Os clusters são uma máquina de estados; o Spark real é executado através de Jobs.
  • Um único processo, sem alta disponibilidade. DuckDB admite um único escritor, então a carga concorrente é serializada.
  • As tabelas MANAGED são invisíveis para Spark. Use tabelas Delta EXTERNAL quando Spark precisar dos dados.
  • Não implementado: Delta Live Tables, Model Registry, Vector Search, Lakeview e Repos. Chamamos a API de pipelines e obtemos um erro NotImplemented claro.

Agentes de IA como Claude Code podem usar MiniLake?

Sim. MiniLake inclui um servidor MCP, desativado por padrão:

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

A segunda linha o registra em Claude Code. A vantagem é tanto de segurança quanto de comodidade: um agente pode criar catálogos, carregar tabelas com dados e executar jobs do Spark contra um lakehouse que não pode quebrar e que não custa nada quando se engana. Os testes MCP da suite, incluindo a execução de um script do Spark real através das ferramentas do agente, aprovaram em nosso teste.

Quando é apropriado usar MiniLake?

Encaixa quando o que você quer acelerar é o ciclo da API: código Python baseado em databricks-sdk, módulos do Terraform, Asset Bundles, jobs do Spark, pipelines de CI que hoje precisam de um workspace e agentes aos quais você quer dar liberdade sem uma conta na nuvem.

Encaixa pior quando seu trabalho é principalmente SQL escrito para os SQL warehouses do Databricks (pela diferença de dialeto), ou quando você precisa validar permissões, Delta Live Tables ou qualquer outra coisa da lista de não implementados. E é uma ferramenta de desenvolvimento, não um lugar onde executar nada compartilhado.

Nosso veredicto: para um emulador de uma plataforma tão grande, a honestidade é a característica principal. O que emula foi executado de verdade em nossos testes, e o que não emula você o diz em voz alta. Instale com Docker por enquanto e tenha em mente a diferença de dialeto desde a primeira consulta.


E você? Onde você testa hoje seu código do Databricks antes de levá-lo para produção?

Qual parte do seu trabalho com Databricks você moveria primeiro para local?
  • Jobs do Spark e notebooks
  • Despliegues com Terraform ou Asset Bundles
  • Testes em CI
  • Prefiro outra opção (nos conte qual)
0 votante

Comente abaixo ou, se este artigo chegou a você por email, responda diretamente ao email: sua resposta é publicada aqui.

Relacionado: DuckDB 2.0: como migrar desde 1.4 e 1.5 sem quebrar seu banco de dados ou seu código Python