Pular para o conteúdo
Lucas Lessa

Trilha de certificações

Professional

Databricks Certified Data Engineer Professional

Avalia habilidades avançadas para construir, otimizar e manter soluções de engenharia de dados de nível produção: pipelines seguros e econômicos, streaming, CDC, observabilidade, governança, compliance, otimização, CI/CD com bundles, CLI/REST API e AI functions.

Formato da prova

Questões
60 questões
Duração
120 min
Taxa
US$ 200
Idiomas
Inglês
Validade
2 anos
Versão do guia oficial
09 de out. de 2026

Nenhum obrigatório. A Databricks recomenda fortemente um ano de experiência prática com os temas do guia e o curso Advanced Data Engineering with Databricks.

O que cai e quanto pesa

Número aproximado de questões por seção, considerando as 60 questões pontuadas.

Seção 1 · 23% · ≈ 14 questões

Código para processamento de dados com Python e SQL

Objetivos oficiais

  • Estruturar projetos Python escaláveis para Declarative Automation Bundles (antigos DABs), com desenvolvimento modular e integração com CI/CD.
  • Resolver conflitos de dependência e falhas de instalação de bibliotecas externas (PyPI, wheels locais, arquivos-fonte) em serverless, pipelines e ambientes implantados por bundle.
  • Desenvolver UDFs com Pandas, Python e SQL, incluindo funções do Unity Catalog, conforme as restrições dadas.
  • Criar pipelines de streaming prontos para produção com Lakeflow Pipelines e Auto Loader.
  • Criar e automatizar cargas ETL com Lakeflow Jobs via UI, API e CLI.
  • Escolher entre streaming table e materialized view conforme latência, custo e necessidade de refresh.
  • Implementar CDC com as APIs AUTO CDC (antigo APPLY CHANGES) em Lakeflow Pipelines, incluindo SCD tipo 1 e tipo 2 via stored_as_scd_type.
  • Escolher entre Spark Structured Streaming e Apache Spark Declarative Pipelines para ETL escalável conforme as restrições operacionais.
  • Criar Lakeflow Jobs com operadores de controle de fluxo como If/Else e For Each.
  • Escolher compute e configuração adequados para ambientes e dependências: serverless (environments, dependências, performance mode), tarefas de notebook com muita memória e ajustes de auto-otimização (ex.: desligar retries).
  • Desenvolver testes unitários e de integração com assertDataFrameEqual, assertSchemaEqual, DataFrame.transform e frameworks de teste.
  • Aplicar a semântica de processamento com estado do Structured Streaming: watermarks, output modes, foreachBatch e checkpoints para recuperação exactly-once.

Projeto Python + bundle

meu_projeto/
├── databricks.yml          # bundle: recursos e targets
├── resources/              # jobs.yml, pipelines.yml (separados por recurso)
├── src/meu_projeto/        # pacote Python importável (transformações puras)
│   └── transformacoes.py
├── tests/                  # pytest
└── pyproject.toml          # gera o wheel

O bundle pode construir o wheel (artifacts) e anexá-lo às tarefas (libraries: - whl: ../dist/*.whl). Código de negócio fica no pacote, os notebooks só orquestram — isso torna tudo testável.

Dependências

  • Serverless: dependências no environment da tarefa/notebook (environment_version + lista de pacotes), não em init scripts (serverless não tem init script).
  • Pipelines: dependências na configuração do pipeline (environment) ou %pip install no topo do código-fonte.
  • Conflito (ImportError, versão errada): fixe versões, evite instalar por cima do runtime, e confira se um wheel local também está no artefato do bundle.

UDFs: qual usar

TipoQuandoObservação
Função nativa (F.*)Sempre que existirMais rápida: otimizada pelo Catalyst/Photon
SQL UDF / função do UCLógica reutilizável e governadaCREATE FUNCTION main.f.limpa(x STRING) RETURNS STRING RETURN trim(lower(x))
Pandas UDF (@pandas_udf)Lógica em Python vetorizadaUsa Arrow: processa lotes, muito mais rápida que UDF Python linha a linha
UDF Python escalarÚltimo recursoSerializa linha a linha

Streaming table x materialized view

  • Streaming table: lê cada linha nova uma vez (append). Ideal para ingestão e baixa latência. Não "corrige" o passado.
  • Materialized view: mantém o resultado completo de uma query (agregações, joins), refrescada incrementalmente quando possível. Reflete atualizações tardias em dias anteriores.

AUTO CDC (SCD 1 e 2)

from pyspark import pipelines as dp

dp.create_streaming_table("clientes_silver")

dp.create_auto_cdc_flow(
    target="clientes_silver",
    source="clientes_cdc_bronze",
    keys=["cliente_id"],
    sequence_by="ts_evento",                 # ordena eventos fora de ordem
    apply_as_deletes="operacao = 'DELETE'",
    except_column_list=["operacao", "ts_evento"],
    stored_as_scd_type=2,                    # 1 = sobrescreve; 2 = histórico com __START_AT/__END_AT
)

Em SQL: CREATE FLOW ... AS AUTO CDC INTO clientes_silver FROM STREAM(bronze) KEYS (cliente_id) SEQUENCE BY ts_evento STORED AS SCD TYPE 2.

Structured Streaming x pipelines declarativos

Pipelines declarativos cuidam de dependências, checkpoints, retries, expectations e infraestrutura. Structured Streaming "puro" dá controle total (ex.: foreachBatch com lógica arbitrária, sinks customizados). Pergunta fala em "menos operação/gestão" → pipeline declarativo.

Estado no streaming

(eventos
  .withWatermark("ts", "30 minutes")                  # limita o estado: descarta o que chegar >30 min atrasado
  .groupBy(F.window("ts", "10 minutes"), "loja")
  .count()
  .writeStream
  .outputMode("append")                               # append exige watermark em agregações
  .option("checkpointLocation", "/Volumes/main/chk/contagem")
  .toTable("main.gold.contagem_por_loja"))
  • Output modes: append (só linhas finais), update (linhas alteradas), complete (tabela inteira; estado cresce sem limite).
  • Checkpoint = offsets + estado → reinício sem duplicar (exactly-once com sink idempotente/transacional como Delta).
  • foreachBatch: cada micro-batch vira um DataFrame batch — use para MERGE em Delta.

Testes

from pyspark.testing import assertDataFrameEqual, assertSchemaEqual

def adiciona_total(df):
    return df.withColumn("total", F.col("qtd") * F.col("preco"))

def test_total(spark):
    entrada = spark.createDataFrame([(2, 5.0)], "qtd INT, preco DOUBLE")
    esperado = spark.createDataFrame([(2, 5.0, 10.0)], "qtd INT, preco DOUBLE, total DOUBLE")
    assertDataFrameEqual(entrada.transform(adiciona_total), esperado)

DataFrame.transform encadeia funções puras — fáceis de testar uma a uma.

Compute

Serverless com performance mode (prioriza velocidade de start/execução) ou standard (mais barato, pode demorar mais). Notebook que precisa de muita RAM → tarefa com high-memory. Para ETL não idempotente, desligue retries automáticos.

Pegadinhas comuns

  • Pandas UDF ≠ UDF Python comum: a Pandas UDF é vetorizada (Arrow) e muito mais rápida.
  • complete mode guarda todo o estado — não serve para limitar memória; watermark sim.
  • SCD tipo 2 precisa de sequence_by para ordenar eventos; sem ele, eventos fora de ordem corrompem o histórico.

Documentação:Bundles: projetos PythonAUTO CDCWatermarksTestes com PySpark

Seção 2 · 12% · ≈ 7 questões

Ingestão e aquisição de dados

Objetivos oficiais

  • Desenvolver pipelines que ingerem vários formatos (Delta, Parquet, JSON, Iceberg, CSV, binário) de fontes como barramentos de mensagens (Kafka, Kinesis, Pub/Sub) e cloud storage.
  • Configurar pipelines CDC incrementais com Lakeflow Pipelines tendo Delta ou Iceberg como formato de destino.
  • Configurar ingestão CDC de bancos relacionais (SQL Server, MySQL, PostgreSQL) com Lakeflow Connect.
  • Implementar OpenSharing (D2D e Databricks-to-Open) e Clean Rooms para colaboração com privacidade.
  • Configurar Lakehouse Federation com governança sobre os sistemas de origem, aplicando permissões do UC e credenciais no nível da conexão.

Mensageria

(spark.readStream.format("kafka")
   .option("kafka.bootstrap.servers", "broker:9092")
   .option("subscribe", "pedidos")
   .option("startingOffsets", "earliest")
   .load()
   .select(F.col("value").cast("string").alias("payload"), "timestamp"))

Kinesis (format("kinesis")) e Pub/Sub (format("pubsub")) seguem a mesma ideia. Arquivos binários (PDF, imagem): format("binaryFile") ou Auto Loader com cloudFiles.format = binaryFile.

CDC de bancos com Lakeflow Connect

Conector gerenciado para SQL Server, MySQL e PostgreSQL: um gateway lê o log de mudanças do banco e um pipeline de ingestão aplica inserts/updates/deletes nas tabelas do UC. Zero código, incremental, governado. Alternativas (JDBC full load noturno, exportar CSV) perdem deletes ou custam caro.

Destino Iceberg

Tabelas gerenciadas do UC podem ser Iceberg (ou Delta com UniForm, legível por clientes Iceberg). Pipelines podem gravar nelas, inclusive com AUTO CDC.

OpenSharing (Delta Sharing) e Clean Rooms

  • Databricks-to-Databricks (D2D): o destinatário tem workspace com UC; compartilha tabelas, views, volumes, modelos, notebooks. Sem cópia.
  • Databricks-to-Open: destinatário fora da Databricks (pandas, Spark, Power BI…) usa um arquivo de credencial / token ou OIDC.
  • Clean Rooms: duas ou mais partes analisam dados juntas sem expor os dados brutos uma à outra; só notebooks/saídas aprovados rodam.
CREATE SHARE vendas_parceiro;
ALTER SHARE vendas_parceiro ADD TABLE main.gold.vendas_agregadas;
CREATE RECIPIENT parceiro_x;                       -- open: gera link de ativação
GRANT SELECT ON SHARE vendas_parceiro TO RECIPIENT parceiro_x;

Lakehouse Federation

Consultar Postgres, MySQL, SQL Server, Snowflake, BigQuery, Redshift… sem copiar:

CREATE CONNECTION pg_erp TYPE postgresql
  OPTIONS (host 'erp.db', port '5432', user secret('scope','u'), password secret('scope','p'));
CREATE FOREIGN CATALOG erp USING CONNECTION pg_erp OPTIONS (database 'erp');
GRANT USE CATALOG, USE SCHEMA, SELECT ON CATALOG erp TO `analistas`;

A credencial fica na conexão (os usuários não a veem) e o acesso é controlado por GRANTs do UC, com linhagem e auditoria.

Pegadinhas comuns

  • Delta Sharing não copia dados; Clean Rooms são para colaboração sem que nenhum lado veja os dados brutos do outro.
  • Federation é para consultar no lugar; para ingerir com CDC contínuo, use Lakeflow Connect.

Documentação:KafkaLakeflow Connect: bancosDelta SharingClean RoomsLakehouse Federation

Seção 3 · 12% · ≈ 7 questões

Manipulação de dados

Objetivos oficiais

  • Aplicar transformações avançadas (funções de janela, joins e agregações) com Spark SQL e PySpark em grandes volumes.
  • Modelar e consultar dados semiestruturados com o tipo VARIANT e funções relacionadas (parse_json, variant_get).
  • Aplicar AI functions, incluindo ai_query, para inferência de modelos dentro de pipelines (enriquecimento e classificação).
  • Implementar expectations de qualidade em Lakeflow Pipelines para colocar em quarentena, descartar ou falhar com registros ruins.

Janelas

SELECT *,
  ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY ts DESC)        AS rn,
  SUM(valor)  OVER (PARTITION BY cliente_id ORDER BY ts
                    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)  AS acumulado,
  LAG(valor)  OVER (PARTITION BY cliente_id ORDER BY ts)               AS valor_anterior
FROM main.silver.pedidos
QUALIFY rn = 1;   -- último pedido de cada cliente

VARIANT

CREATE TABLE main.bronze.eventos AS
SELECT parse_json(payload) AS v FROM main.raw.eventos_json;

SELECT v:usuario.id::BIGINT          AS usuario_id,   -- caminho com ':'
       variant_get(v, '$.valor', 'DOUBLE') AS valor,
       try_variant_get(v, '$.cupom', 'STRING') AS cupom  -- NULL se o tipo não bate
FROM main.bronze.eventos;

VARIANT guarda JSON num formato binário eficiente, sem schema fixo, e a extração é muito mais rápida que get_json_object em STRING.

AI functions

SELECT ticket_id,
       ai_classify(texto, ARRAY('cobrança', 'entrega', 'produto')) AS categoria,
       ai_query('databricks-meta-llama-3-3-70b-instruct',
                CONCAT('Resuma em uma frase: ', texto))           AS resumo
FROM main.silver.tickets;

ai_query chama qualquer endpoint de serving (fundação ou seu modelo) em batch, paralelizado.

Expectations: as três ações

SintaxeEfeito
EXPECT (cond)Mantém a linha, registra métrica (warn)
... ON VIOLATION DROP ROWDescarta a linha
... ON VIOLATION FAIL UPDATEFalha o update do pipeline

Quarentena: inverta a regra numa segunda tabela.

regras = {"id_ok": "id IS NOT NULL", "valor_ok": "valor >= 0"}
cond = " AND ".join(f"({r})" for r in regras.values())

@dp.table
@dp.expect_all_or_drop(regras)
def pedidos_validos(): return spark.readStream.table("bronze_pedidos")

@dp.table
def pedidos_quarentena():
    return spark.readStream.table("bronze_pedidos").where(f"NOT ({cond})")

Pegadinhas comuns

  • variant_get falha se o tipo não converte; try_variant_get devolve NULL.
  • Expectation sem ON VIOLATION não remove nada — só mede.

Documentação:VARIANTAI functionsExpectations

Seção 4 · 10% · ≈ 6 questões

Monitoramento e alertas

Objetivos oficiais

  • Usar system tables (billing, compute, access, lakeflow) para análise de custo, auditoria e monitoramento de cargas.
  • Usar REST APIs, CLI e SDK da Databricks para monitorar e analisar jobs e pipelines.
  • Usar o event log dos pipelines para monitorar saúde e qualidade de dados.
  • Usar Databricks alerts para monitorar métricas de negócio governadas, qualidade e anomalias, uso e custo, saúde de SQL warehouse/queries, eventos de auditoria e segurança, qualidade de agentes de IA e ramificação de Lakeflow Jobs.
  • Usar a UI e a API de Lakeflow Jobs para monitorar status e métricas de desempenho.

System tables que caem

TabelaPara quê
system.billing.usageDBUs por SKU, job, warehouse, usuário (usage_metadata)
system.billing.list_pricesPreço de tabela por SKU → custo = DBU × preço
system.compute.clusters, warehousesConfiguração e histórico de compute
system.access.auditQuem fez o quê (logins, GRANTs, leituras)
system.lakeflow.jobs, job_run_timeline, job_task_run_timelineExecuções, duração, status
system.query.historyQueries de SQL warehouses e serverless
SELECT u.usage_metadata.job_id,
       SUM(u.usage_quantity * p.pricing.default) AS custo_usd
FROM system.billing.usage u
JOIN system.billing.list_prices p
  ON u.sku_name = p.sku_name
 AND u.usage_start_time BETWEEN p.price_start_time AND COALESCE(p.price_end_time, now())
WHERE u.usage_date >= date_trunc('month', current_date() - INTERVAL 1 MONTH)
GROUP BY 1 ORDER BY 2 DESC LIMIT 10;

API, CLI e SDK

databricks jobs list-runs --job-id 123 --limit 20
databricks pipelines list-pipeline-events <pipeline-id>
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
for run in w.jobs.list_runs(job_id=123, limit=20):
    print(run.run_id, run.state.result_state, run.run_duration)

Event log do pipeline

SELECT timestamp, details:flow_progress.data_quality.expectations
FROM event_log(TABLE(main.silver.pedidos))
WHERE event_type = 'flow_progress';

Traz progresso dos flows, linhas processadas, resultado das expectations, erros e linhagem.

Alerts

Um alert roda uma query num agendamento e notifica (e-mail, Slack, webhook) quando a condição bate — ex.: custo diário acima de X, % de linhas rejeitadas, queries lentas. Também pode servir de tarefa num job para ramificar o fluxo.

Pegadinhas comuns

  • Custo em dólar exige juntar billing.usage com list_prices (usage só tem DBUs).
  • Logs de driver por cluster não são a fonte para custo ou auditoria — system tables são.

Documentação:System tablesEvent log do pipelineAlerts

Seção 5 · 15% · ≈ 9 questões

Otimização de custo e desempenho

Objetivos oficiais

  • Explicar como tabelas gerenciadas do UC, Predictive Optimization e Liquid Clustering reduzem a manutenção de uma carga.
  • Escolher a técnica de otimização Delta (deletion vectors, Liquid Clustering, CLUSTER BY AUTO) para um padrão de acesso.
  • Entender como o cache (disk/Delta cache) melhora leituras repetidas dos mesmos dados.
  • Aplicar Change Data Feed (CDF) para expor mudanças por linha (updates/deletes) e processar incrementalmente.
  • Usar o query profile para achar gargalos: data skipping ruim, estratégia de join e shuffles.
  • Comparar Liquid Clustering com particionamento/ZORDER para um tamanho de tabela e padrão de consulta.

Menos manutenção

  • Tabela gerenciada do UC + Predictive Optimization: OPTIMIZE, VACUUM e ANALYZE automáticos.
  • Liquid Clustering: layout incremental, sem escolher partições; CLUSTER BY AUTO deixa a Databricks escolher (e trocar) as chaves pelo histórico de queries.

Qual técnica para qual padrão

PadrãoTécnica
Muitos MERGE/UPDATE/DELETE pequenosDeletion vectors (marca linhas removidas sem reescrever o arquivo)
Filtros frequentes em 1–4 colunas, alta cardinalidadeLiquid Clustering nessas colunas
Padrão de consulta muda ou é desconhecidoCLUSTER BY AUTO
Tabela pequena (< ~1 TB)Geralmente nada além de clustering/auto — não particione

Liquid x partição/ZORDER

Partição só ajuda com coluna de baixa cardinalidade e tabelas muito grandes; partição de alta cardinalidade gera milhões de arquivos pequenos. ZORDER não é incremental e não muda de chave sem reescrever. Liquid é incremental, aceita mudar chaves e funciona com alta cardinalidade.

Cache

O disk cache (antigo Delta cache) guarda cópias locais (SSD) dos arquivos Parquet lidos → leituras repetidas dos mesmos dados ficam rápidas. É automático em instâncias com SSD e no SQL warehouse. Diferente do df.cache() do Spark (memória do executor, por sessão).

Change Data Feed

ALTER TABLE main.silver.clientes SET TBLPROPERTIES (delta.enableChangeDataFeed = true);

SELECT * FROM table_changes('main.silver.clientes', 120);  -- desde a versão 120
-- colunas extras: _change_type (insert, update_preimage, update_postimage, delete), _commit_version
spark.readStream.option("readChangeFeed", "true").table("main.silver.clientes")

O downstream processa só o que mudou, inclusive updates e deletes.

Query profile

Mostra por operador: linhas, tempo, arquivos lidos x podados (data skipping), tipo de join (broadcast hash, sort-merge, shuffle hash) e bytes de shuffle. Sinais:

  • "files read" quase igual a "files total" com filtro seletivo → layout ruim → Liquid Clustering na coluna do filtro;
  • sort-merge com um lado pequeno → broadcast;
  • shuffle enorme → filtrar antes, pré-agregar, cluster nas chaves de join.

Pegadinhas comuns

  • VACUUM com retenção zero não resolve write amplification e quebra time travel/leitores concorrentes.
  • Particionar por coluna de alta cardinalidade (ex.: id do cliente) é antipadrão.
  • CDF precisa estar ligado ANTES das mudanças que você quer ler.

Documentação:Deletion vectorsLiquid ClusteringChange Data FeedQuery profile

Seção 6 · 8% · ≈ 5 questões

Segurança e compliance

Objetivos oficiais

  • Aplicar ACLs de menor privilégio em objetos do Unity Catalog e recursos do workspace.
  • Aplicar políticas ABAC com governed tags para impor filtros de linha e máscaras de coluna em escala.
  • Aplicar anonimização e pseudonimização (hash, tokenização, supressão e generalização) a dados confidenciais com máscaras de coluna e recursos do UC.
  • Implementar um pipeline compatível que detecta e mascara PII em batch e streaming com recursos do Unity Catalog.
  • Implementar uma estratégia de expurgo que atenda retenção e exclusão (ex.: direito ao esquecimento da LGPD/GDPR) com Delta Lake e Unity Catalog.

Menor privilégio

Conceda a grupos, no menor escopo que resolve, apenas o privilégio necessário (SELECT em vez de ALL PRIVILEGES; MODIFY só para quem escreve). Jobs rodam como service principal. Recursos do workspace (jobs, warehouses, notebooks) têm ACLs próprias (CAN VIEW, CAN RUN, CAN MANAGE).

ABAC com governed tags

-- 1) marcar colunas (ou deixar a classificação automática sugerir)
ALTER TABLE main.crm.clientes ALTER COLUMN cpf SET TAGS ('pii' = 'cpf');

-- 2) uma política vale para o catálogo todo, inclusive tabelas futuras
--    (sintaxe resumida: confira a forma exata na documentação de ABAC)
CREATE POLICY mascarar_pii ON CATALOG main
  COLUMN MASK main.seg.mascara_pii
  TO `account users` EXCEPT `compliance`
  FOR TABLES MATCH COLUMNS has_tag('pii') AS col ON COLUMN col;

Técnicas de anonimização

TécnicaExemploReversível?
Hash (com salt)sha2(concat(cpf, :salt), 256)Não; mas permite join entre tabelas
Tokenizaçãotroca o valor por um token; tabela de mapeamento protegidaSim, para quem acessa o cofre
Supressão'***' ou NULLNão
Generalizaçãoidade 37 → faixa "30–39"; CEP → 3 primeiros dígitosNão

Pipeline com PII

Detecte (classificação de dados do UC / ai_mask / regex), aplique máscara ou hash na silver e mantenha o dado bruto num schema restrito. Funciona igual em batch e streaming porque a máscara fica na tabela, não no código de cada consumidor.

Direito ao esquecimento

DELETE FROM main.silver.clientes WHERE cliente_id = 42;   -- com deletion vectors: rápido
REORG TABLE main.silver.clientes APPLY (PURGE);            -- reescreve os arquivos sem as linhas
VACUUM main.silver.clientes;                               -- remove arquivos antigos após a retenção

Sem VACUUM, o dado ainda existe em arquivos antigos (time travel). Lembre-se de propagar o delete para tabelas derivadas (CDF ajuda) e de checar retenção de logs.

Pegadinhas comuns

  • DELETE sozinho não apaga fisicamente: versões antigas continuam acessíveis até o VACUUM.
  • Hash sem salt é reversível por força bruta para domínios pequenos (CPF, telefone).

Documentação:ABACFiltros e máscarasGDPR/LGPD com Delta

Seção 7 · 5% · ≈ 3 questões

Governança de dados

Objetivos oficiais

  • Entender tags e comentários do Unity Catalog como metadados que melhoram a descoberta de dados.
  • Entender o modelo de herança de permissões do Unity Catalog entre catálogos, schemas e objetos.

Tags e comentários

COMMENT ON TABLE main.gold.vendas IS 'Vendas diárias consolidadas por loja (fonte: ERP).';
ALTER TABLE main.gold.vendas ALTER COLUMN receita COMMENT 'Receita líquida em BRL';
ALTER TABLE main.gold.vendas SET TAGS ('dominio' = 'comercial', 'certificado' = 'sim');

Comentários e tags aparecem no Catalog Explorer, na busca e são usados por Genie/assistentes para entender os dados. Governed tags têm valores controlados e podem disparar políticas ABAC.

Herança

Privilégio concedido em catálogo vale para todos os schemas e objetos dentro dele — inclusive os criados depois. O mesmo vale de schema para tabelas. Não existe "DENY" no UC: a restrição se faz não concedendo, ou com filtros/máscaras. O owner de um objeto pode concedê-lo; owner do catálogo controla tudo abaixo.

Pegadinhas comuns

  • Grant no catálogo NÃO dá ownership das tabelas novas — só o privilégio concedido.

Documentação:TagsModelo de privilégios

Seção 8 · 10% · ≈ 6 questões

Debug e deploy

Objetivos oficiais

  • Identificar informações de diagnóstico na Spark UI, logs do cluster, system tables e query profiles para resolver erros.
  • Analisar erros e corrigir execuções com falha usando repair run e sobrescrita de parâmetros.
  • Implantar recursos com Declarative Automation Bundles (antigos Databricks Asset Bundles).
  • Configurar CI/CD baseado em Git com Git folders (antigos Repos) para implantar notebooks e código.

Onde olhar

PerguntaFonte
Qual stage/task está lenta? skew? spill?Spark UI (Stages, SQL/DataFrame)
Erro de biblioteca, init script, OOM do driverLogs do driver/cluster e event log do cluster
Tendência de duração/custo, falhas em massaSystem tables (lakeflow, billing, query.history)
Por que esta query SQL é lenta?Query profile

Repair run

Quando 2 de 10 tarefas falham, repair run reexecuta só as que falharam e as dependentes, reaproveitando o que já deu certo — e permite sobrescrever parâmetros (ex.: corrigir uma data). Mais rápido e barato que rodar o job inteiro.

databricks jobs repair-run 987654 --rerun-tasks transformar --job-parameters '{"data":"2026-10-18"}'

Bundles em CI/CD

databricks bundle validate → deploy -t staging → testes de integração → deploy -t prod com service principal. Targets definem host, variáveis, permissões e mode.

Git folders

Para notebooks e código no workspace: branch por feature, PR no provedor Git, e em produção um Git folder fixado na branch principal atualizado pela API/CLI no pipeline de CI (databricks repos update <id> --branch main) — ou, melhor, bundles.

Pegadinhas comuns

  • Repair run não reexecuta tarefas que já passaram (a menos que sejam dependentes das que falharam).

Documentação:Repair runBundlesCI/CD com Git folders

Seção 9 · 5% · ≈ 3 questões

Modelagem de dados

Objetivos oficiais

  • Projetar layouts escaláveis de tabelas Delta/Iceberg: partição alinhada ao grão, clustering alinhado ao padrão de acesso e arquivos de tamanho equilibrado com compactação.
  • Projetar modelos dimensionais para análise com Materialized Views para agregações pré-calculadas e Metric Views do Unity Catalog para métricas governadas e reutilizáveis.

Layout

  • Partição só pela coluna que bate com o grão de carga/expurgo e tem baixa cardinalidade (ex.: data em tabelas de muitos TB).
  • Clustering pelas colunas de filtro/join mais usadas.
  • Compactação (OPTIMIZE, ou automática) mantém arquivos de tamanho saudável (~100 MB–1 GB) e evita o problema dos arquivos pequenos.

Dimensional + MVs + Metric Views

Fato (eventos, medidas) + dimensões (cliente, produto, tempo). Por cima:

  • Materialized views pré-calculam agregações pesadas que os dashboards leem.
  • Metric views definem a métrica uma vez, governada no UC:
version: 1.1
source: main.gold.fato_vendas
dimensions:
  - name: loja
    expr: loja_id
  - name: mes
    expr: date_trunc('MONTH', data_venda)
measures:
  - name: receita_liquida
    expr: SUM(valor_bruto - descontos - devolucoes)
SELECT mes, MEASURE(receita_liquida) FROM main.gold.mv_vendas GROUP BY mes;

Resolve "cada dashboard calcula a receita de um jeito".

Pegadinhas comuns

  • Metric view resolve consistência da definição; MV resolve desempenho. Juntas resolvem os dois.

Documentação:Metric viewsMaterialized views

Treinamentos recomendados pela Databricks

  • Instrutor: Advanced Data Engineering with Databricks
  • Academy: Advanced Techniques with Apache Spark Declarative Pipelines
  • Academy: Databricks Data Privacy
  • Academy: Databricks Performance Optimization
  • Academy: Automated Deployment with Declarative Automation Bundles
Guia do exame Data Engineer Professional · Lucas Lessa