Construir a área de dados e vendas de uma distribuidora B2B do zero, em 4 noites. Empresa fictícia, dado gerado com seed fixa, sujeira proposital.
Domínio: distribuidora de perfumaria árabe — vende para perfumarias, farmácias, revendedoras e e-commerces. Stack: Databricks Free Edition (serverless), SQL, Python e Claude Code.
| Noite | Data | Tema | Pasta |
|---|---|---|---|
| 1 | seg 24/08 | Objetivo e a primeira análise | aulas/aula-01-databricks-sql · 📺 gravação |
| 2 | ter 25/08 | Engenharia de dados: o projeto roda sozinho | aulas/aula-02-engenharia-de-dados · 📺 gravação |
| 3 | qua 26/08 | Ciência de dados: o dado vira decisão | aulas/aula-03-ciencia-de-dados · 📺 gravação |
| 4 | qui 27/08 | Apps e agentes: o projeto ganha uma URL | aulas/aula-04-app-e-genie · 📺 gravação |
Cada pasta é autocontida: tem o próprio README, os exemplos numerados e o que for preciso rodar.
noite 1 noite 2 noite 3 noite 4
─────── ─────── ─────── ───────
a query → vira camada → vira decisão → vira produto
quebra no que roda modelo e fila app, Genie e o
dado sujo sozinha dos 200 retorno da ligação
"qual foi "como não "para quem eu "e quem não
a receita?" repetir isso?" ligo segunda?" escreve SQL?"
O projeto inteiro — do CSV cru ao app que escreve de volta na gold — sai de doze prompts colados em sequência no Claude Code. Cada um termina com um deploy.
➡️ PROMPTS.md — a sequência completa, com o texto de cada
prompt pronto para copiar.
| Prompts | Noite | O que existe no fim |
|---|---|---|
| 1 a 6 | engenharia | catálogo, pipeline de 12 tarefas, dashboard e Genie |
| 7 a 9 | ciência de dados | modelo no Unity Catalog e a fila dos 200 · 15 tarefas |
| 10 a 12 | apps e agentes | Genie da direção, o app e o retorno da ligação · 16 tarefas |
O texto dos prompts no PROMPTS.md é extraído dos arquivos de cada noite,
não copiado à mão — os dois nunca divergem. O que fica só nos arquivos de cada
noite é o resto: o que mostrar antes de colar, o que falar enquanto o Claude
Code trabalha, e a tabela "se der errado".
# 1. gerar o dataset (seed fixa: todo mundo gera exatamente o mesmo dado)
python3 material/gerar_dataset.py --saida ./dados --seed 42
# 2. autenticar no Databricks (cria o profile e salva a credencial)
databricks auth login
# 3. seguir a aula 01, que é toda pelo navegador
cd aulas/aula-01-databricks-sql && cat README.mdA noite 2 é a que exige terminal. O passo a passo completo — versões
mínimas, o erro de credencial que quase todo mundo vê, bundle init, skills,
MCP e guard rails — está em
aulas/aula-02-engenharia-de-dados/README.md.
O runner scripts/run_sql.py executa qualquer .sql deste repositório no
warehouse, uma statement por vez:
python3 scripts/run_sql.py aulas/aula-01-databricks-sql/exemplo-01-primeiro-select.sqlOs exemplos apontam para o catálogo lakehouse_rotaperfume, que
ainda não existe — ele é criado ao vivo, no primeiro bloco da noite 1:
python3 scripts/run_sql.py aulas/aula-01-databricks-sql/00-setup-catalogo.sqlIsso é proposital. O aluno vê o catálogo nascer vazio, os schemas serem criados e o dado entrar — em vez de receber tudo pronto.
Se você já tem um catálogo com outro nome, troque o prefixo nas queries.
Gerado por material/gerar_dataset.py, ~14 MB, período de setembro/2024 a agosto/2026.
dados/
├── erp/ produtos · pedidos · itens_pedido · pagamentos · estoque
└── crm/ clientes · vendedores · carteira · oportunidades · visitas
| Tabela | Linhas | O que tem |
|---|---|---|
pedidos |
28.729 | cliente, vendedor, data, canal, status, valor |
itens_pedido |
197.724 | SKU, quantidade, preço praticado, desconto |
pagamentos |
27.772 | forma, parcelas, vencimento, status |
produtos |
292 | categoria, marca, nota olfativa, custo, lançamento |
estoque |
8.400 | snapshot semanal por SKU, com ruptura |
clientes |
3.040 | CNPJ, razão social, segmento, cidade |
visitas |
37.936 | data, resultado, duração |
oportunidades |
5.979 | funil: origem, etapa, valor, motivo de perda |
carteira |
3.637 | vínculo vendedor ↔ cliente, com vigência |
vendedores |
42 | região, admissão, desligamento, meta |
A sujeira é proposital. CNPJ em três formatos, data em dois, cliente duplicado, devolução como quantidade negativa, vendedor desligado com carteira ativa. Limpar isso é o conteúdo da noite 2 — não conserte o gerador.
aulas/
├── aula-01-databricks-sql/ tudo pela interface: catálogo, bronze, 6 exemplos
├── aula-02-engenharia-de-dados/
│ ├── prd/ os 6 prompts (+ o reset 00) e o roteiro da noite
│ ├── rotaperfume/ o bundle DABs: raw → bronze → silver → gold → BI → Genie
│ └── slides/ gerar_slides.py — os slides como código
├── aula-03-ciencia-de-dados/ 3 prompts: features, modelo no UC e a fila dos 200
│ ├── prd/ os 3 prompts, o roteiro e o 99-limpar
│ ├── gabarito/ src/ml/ pronto, para conferir depois
│ └── notebooks/ conferência do resultado e a demo de vazamento
└── aula-04-app-e-genie/ 3 prompts: o Genie da direção, o app e o retorno
├── prd/ os 3 prompts, o roteiro e o 99-limpar
└── rotaperfume-direcao/ o Databricks App (AppKit), bundle próprio
material/ PRD da imersão, gerador do dataset, slides
scripts/ run_sql.py — roda um .sql no warehouse
dados/ dataset gerado (não versionado — reproduza com o comando acima)
- Catálogo
lakehouse_rotaperfume, schemasbronze/silver/gold. - Tabelas e colunas em snake_case e português, iguais às do CSV.
- A bronze guarda o dado como veio, com a sujeira.
- Sempre passe
--profilenos comandos do Databricks. - Bundle:
databricks bundle deploy. App:databricks apps deploy— umbundle deploycria o app parado, sem URL.