Pular para o conteúdo
Lucas Lessa

Trilha de certificações

Associate

Databricks Certified Data Engineer Associate

Avalia se você usa a Data Intelligence Platform para as tarefas fundamentais de engenharia de dados: ingestão, transformação com PySpark/SQL, Lakeflow Jobs, CI/CD com Declarative Automation Bundles, troubleshooting e governança com Unity Catalog.

Formato da prova

Questões
45 questões
Duração
90 min
Taxa
US$ 200
Idiomas
Inglês, Japonês, Português (BR), Coreano
Validade
2 anos
Versão do guia oficial
04 de mai. de 2026

Nenhum obrigatório. A Databricks recomenda o curso Data Engineering with Databricks e seis meses de prática na plataforma.

O que cai e quanto pesa

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

Seção 1 · 6% · ≈ 3 questões

Databricks Intelligence Platform

Objetivos oficiais

  • Entender os componentes centrais da Data Intelligence Platform: arquitetura, Delta Lake e Unity Catalog.
  • Entender os serviços de computação (características, limitações e modelo de custo) e escolher o mais adequado para cada carga.

A arquitetura em uma frase

A Databricks separa control plane (a interface, o agendador de jobs, o metastore do Unity Catalog — gerenciados pela Databricks) do compute plane (onde o Spark de fato roda: serverless, na conta da Databricks, ou clássico, na sua nuvem). Os dados ficam no object storage (S3, ADLS, GCS) em formato aberto.

Delta Lake: por que ele resolve tanta coisa

Delta é Parquet + um log de transações (_delta_log). Isso dá:

  • ACID: escritas concorrentes não corrompem a tabela;
  • Time travel: SELECT * FROM vendas VERSION AS OF 12 ou TIMESTAMP AS OF '2026-05-01';
  • Schema enforcement (rejeita colunas inesperadas) e schema evolution (mergeSchema);
  • MERGE, UPDATE, DELETE em data lake.
DESCRIBE HISTORY main.vendas.pedidos;           -- quem mudou o quê e quando
RESTORE TABLE main.vendas.pedidos TO VERSION AS OF 41;  -- desfaz uma carga ruim

Unity Catalog em uma frase

Governança única para dados e IA: namespace de 3 níveis catalogo.schema.objeto, permissões com GRANT, linhagem automática e auditoria.

Qual compute escolher

ComputeQuando usarCusto
Serverless (notebooks/jobs)Padrão recomendado: sobe em segundos, sem tuningPaga só o uso, DBU serverless
Job compute (clássico)Jobs agendados que precisam de configuração específica (init scripts, instâncias)Mais barato que all-purpose; morre ao fim do job
All-purposeDesenvolvimento interativo compartilhadoMais caro; fica ligado (use auto-termination)
SQL warehouse (serverless/pro/classic)BI, dashboards, SQL ad hoc com muitos usuáriosEscala por concorrência

Regra de prova: ETL agendado → job compute ou serverless jobs; muitos analistas fazendo SQL → SQL warehouse; exploração em notebook → serverless ou all-purpose com auto-termination.

Pegadinhas comuns

  • All-purpose cluster para job agendado: funciona, mas custa mais — a resposta 'certa' quase sempre é job compute ou serverless.
  • Time travel depende dos arquivos antigos: depois de um VACUUM fora da retenção, versões antigas deixam de existir.

Documentação:Arquitetura da plataformaDelta LakeTipos de compute

Seção 2 · 21% · ≈ 9 questões

Ingestão e carga de dados

Objetivos oficiais

  • Descrever padrões de ingestão (batch, streaming e incremental) e importar dados de arquivos locais, conectores padrão e conectores gerenciados do Lakeflow Connect.
  • Usar COPY INTO para carregar arquivos do object storage (ADLS/S3/GCS) de forma incremental em tabelas do Unity Catalog.
  • Usar Auto Loader com schema enforcement e schema evolution (directory listing ou file notification) para gravar em tabelas do Unity Catalog.
  • Configurar o Lakeflow Connect para ingerir de fontes corporativas diversas em tabelas do Unity Catalog.
  • Usar JDBC/ODBC ou clientes REST em notebooks para gravar no storage ou direto em tabelas do UC, orquestrado por Lakeflow Jobs.
  • Priorizar entre Auto Loader, Lakeflow Connect (padrão e gerenciado), conectores de parceiros e outros métodos conforme volume, frequência, tipo de dado e governança.
  • Ingerir dados semiestruturados e não estruturados (JSON, aninhados) via Lakeflow Connect e conectores gerenciados em tabelas Delta do UC.

O mapa das opções de ingestão

FerramentaFonte típicaIncremental?Quando escolher
Upload pela UICSV/JSON pequeno do seu computadorNãoCarga pontual, protótipo
COPY INTOArquivos no object storageSim (idempotente: lembra o que já carregou)Milhares de arquivos, carga batch simples em SQL
Auto Loader (cloudFiles)Arquivos no object storageSim (checkpoint)Milhões de arquivos, chegada contínua, schema que muda
Lakeflow Connect – conectores gerenciadosSaaS (Salesforce, Workday…) e bancos (SQL Server, Postgres, MySQL)Sim, com CDCQuer zero código e governança no UC
Lakeflow Connect – conectores padrãoKafka, Kinesis, object storage, SFTPSimVocê escreve o pipeline, mas com conector pronto
JDBC/REST em notebookAPI ou banco sem conectorVocê implementaÚltimo recurso; agende com Lakeflow Jobs

COPY INTO

CREATE TABLE IF NOT EXISTS main.bronze.pedidos;

COPY INTO main.bronze.pedidos
FROM 's3://empresa-raw/pedidos/'
FILEFORMAT = JSON
FORMAT_OPTIONS ('inferSchema' = 'true')
COPY_OPTIONS ('mergeSchema' = 'true');

Rodar de novo não duplica: arquivos já carregados são ignorados. Para recarregar tudo, COPY_OPTIONS ('force' = 'true').

Auto Loader

(spark.readStream.format("cloudFiles")
   .option("cloudFiles.format", "json")
   .option("cloudFiles.schemaLocation", "/Volumes/main/bronze/_schemas/pedidos")
   .option("cloudFiles.schemaEvolutionMode", "addNewColumns")
   .load("s3://empresa-raw/pedidos/")
 .writeStream
   .option("checkpointLocation", "/Volumes/main/bronze/_checkpoints/pedidos")
   .trigger(availableNow=True)          # roda como batch incremental e para
   .toTable("main.bronze.pedidos"))
  • schemaLocation guarda o schema inferido e sua evolução.
  • schemaEvolutionMode: addNewColumns (padrão: para o stream, adiciona a coluna, reinicie), rescue (joga o desconhecido em _rescued_data), failOnNewColumns, none.
  • Directory listing (padrão) lista a pasta; file notification usa fila/eventos da nuvem — melhor para diretórios enormes.
  • trigger(availableNow=True) = processa tudo que chegou e encerra: incremental, com custo de batch.

Como decidir na prova

  • "Banco relacional operacional, inserts/updates/deletes, mínimo de código" → Lakeflow Connect gerenciado (CDC).
  • "Milhões de arquivos chegando, schema muda" → Auto Loader.
  • "Carga SQL simples e idempotente de alguns milhares de arquivos" → COPY INTO.
  • "Arquivo único do analista" → upload pela UI.

Pegadinhas comuns

  • COPY INTO não é streaming: é batch idempotente. Auto Loader é que escala para milhões de arquivos.
  • Sem checkpointLocation o stream reprocessa tudo a cada execução.
  • addNewColumns faz o stream falhar UMA vez ao ver coluna nova — é esperado; ao reiniciar ele segue com o schema novo.

Documentação:COPY INTOAuto LoaderLakeflow Connect

Seção 3 · 22% · ≈ 10 questões

Transformação e modelagem de dados

Objetivos oficiais

  • Limpar dados: ler tabelas bronze com PySpark/SQL, tratar nulos, padronizar tipos e gravar em tabelas silver.
  • Combinar DataFrames com inner join, left join, broadcast join, múltiplas chaves, cross join, union e union all.
  • Manipular colunas, linhas e estrutura: adicionar, remover, dividir e renomear colunas, filtrar e explodir arrays.
  • Deduplicar e agregar DataFrames: count, contagem distinta aproximada, média e summary.
  • Entender os parâmetros básicos de tuning (spark.sql.shuffle.partitions, spark.default.parallelism, memória de executor/driver, spark.sql.autoBroadcastJoinThreshold) e medir de novo.
  • Diferenciar e construir objetos da camada gold — materialized views, views, streaming tables e tabelas — para BI no Unity Catalog.
  • Aplicar checagens de qualidade e regras de validação para garantir datasets silver e gold confiáveis.

Medalhão em 30 segundos

Bronze = cru, como chegou. Silver = limpo, tipado, deduplicado. Gold = agregado para o negócio.

Bronze → Silver em PySpark

from pyspark.sql import functions as F

silver = (spark.table("main.bronze.pedidos")
  .withColumn("valor", F.col("valor").cast("decimal(12,2)"))
  .withColumn("data_pedido", F.to_date("data_pedido", "yyyy-MM-dd"))
  .fillna({"canal": "desconhecido"})
  .filter(F.col("pedido_id").isNotNull())
  .dropDuplicates(["pedido_id"]))

silver.write.mode("overwrite").saveAsTable("main.silver.pedidos")

Joins e unions que caem

OperaçãoO que faz
a.join(b, "id")inner: só chaves dos dois lados
a.join(b, "id", "left")tudo de A; nulos onde B não casa
a.join(F.broadcast(b), "id")copia B (pequena) para todos os executores → sem shuffle de A
a.join(b, ["id", "data"])múltiplas chaves
a.crossJoin(b)produto cartesiano (cuidado!)
a.union(b) / unionByNamejunta linhas por posição / por nome. Em DataFrame, union não remove duplicatas
SQL UNION vs UNION ALLUNION remove duplicatas; UNION ALL mantém

Colunas e arrays

df.withColumnRenamed("nm", "nome") \
  .withColumn("partes", F.split("endereco", ",")) \
  .withColumn("item", F.explode("itens")) \
  .drop("coluna_lixo")

Agregações

count, avg, approx_count_distinct (HyperLogLog: rápido, erro pequeno), df.summary() / df.describe() (estatísticas). Deduplicação: dropDuplicates([...]) ou ROW_NUMBER() OVER (PARTITION BY chave ORDER BY ts DESC) = 1.

Parâmetros de tuning

  • spark.sql.shuffle.partitions (padrão 200): nº de partições depois de shuffles (joins/groupBy). Com AQE, o Spark ajusta sozinho.
  • spark.sql.autoBroadcastJoinThreshold (padrão 10 MB): tabelas menores que isso são broadcast automaticamente.
  • spark.executor.memory / spark.driver.memory: memória; collect() grande estoura o driver. Sempre meça de novo depois de mudar (Spark UI / query profile).

Objetos gold

ObjetoArmazena dados?AtualizaçãoUso
ViewNão (só a query)Sempre atual, recalcula a cada leituraLógica leve, segurança
Materialized viewSimRefresh (agendado/pipeline), incremental quando possívelAgregações caras lidas por BI
Streaming tableSimProcessa só o que é novo (append)Ingestão incremental/baixa latência
TabelaSimVocê escreveControle total

Qualidade

Em pipelines declarativos, expectations:

CREATE OR REFRESH STREAMING TABLE silver_pedidos (
  CONSTRAINT id_ok EXPECT (pedido_id IS NOT NULL) ON VIOLATION DROP ROW,
  CONSTRAINT valor_ok EXPECT (valor >= 0) ON VIOLATION FAIL UPDATE
) AS SELECT * FROM STREAM(bronze_pedidos);

Sem ON VIOLATION: só registra a métrica (warn). Fora de pipelines: CHECK constraints em tabelas Delta.

Pegadinhas comuns

  • union() em DataFrame é por POSIÇÃO de coluna — se as colunas estão em ordem diferente, use unionByName().
  • approx_count_distinct troca precisão por velocidade; count(distinct) é exato.
  • Materialized view ≠ view: a MV guarda o resultado; a view recalcula sempre.

Documentação:Arquitetura medalhãoMaterialized viewsExpectations

Seção 4 · 16% · ≈ 7 questões

Lakeflow Jobs

Objetivos oficiais

  • Implementar fluxos de controle (retries e tarefas condicionais como ramificação e loop) com Lakeflow Jobs.
  • Configurar tarefas comuns (notebook, query SQL, dashboard e pipeline) e suas dependências no grafo (DAG) do Lakeflow Jobs.
  • Agendar jobs entendendo os tipos de gatilho: agendado, chegada de arquivo e atualização de tabela.
  • Escolher entre gatilho por tempo e gatilho por dados conforme a disponibilidade dos dados e as dependências.

Anatomia de um job

Um job é um DAG de tarefas. Cada tarefa tem tipo (notebook, Python script/wheel, SQL query, SQL file, dashboard, pipeline, dbt, Run Job, If/else, For each), compute, parâmetros e dependências (depends_on).

Controle de fluxo

  • Retries: por tarefa (max_retries, intervalo). Bom para falhas transitórias.
  • If/else condition: compara valores (ex.: {{tasks.validar.values.qtd_linhas}} > 0) e segue por um ramo.
  • For each: executa uma tarefa aninhada para cada item de uma lista (ex.: lista de países), com concorrência configurável.
  • Run if: quando uma tarefa roda em relação às anteriores — ALL_SUCCESS (padrão), AT_LEAST_ONE_SUCCESS, NONE_FAILED, ALL_DONE, AT_LEAST_ONE_FAILED, ALL_FAILED. Ex.: tarefa de alerta com AT_LEAST_ONE_FAILED.
  • Task values: uma tarefa publica (dbutils.jobs.taskValues.set("qtd", 10)) e outra lê.

Gatilhos

GatilhoDispara quandoUse se
Scheduled (cron)Horário fixoO dado chega sempre no mesmo horário
File arrivalChegam arquivos novos num local do UC/volumeO dado chega em horários imprevisíveis
Table updateTabelas de origem recebem commitsO job depende de outra tabela/pipeline
ContinuousMantém sempre uma execução ativaStreaming contínuo

Regra: se o horário da chegada é incerto, gatilho por dados evita rodar vazio (desperdício) ou rodar cedo demais (dado incompleto).

Pegadinhas comuns

  • Retry não resolve erro de lógica: só ajuda em falha transitória (rede, spot perdido).
  • Uma tarefa de notificação de falha precisa de 'Run if' = AT_LEAST_ONE_FAILED, senão ela nunca roda quando algo falha.

Documentação:Lakeflow JobsControle de fluxo (If/else, For each)Gatilhos

Seção 5 · 10% · ≈ 5 questões

CI/CD

Objetivos oficiais

  • Gerenciar o fluxo de desenvolvimento na UI: criar e trocar branches em Git folders, commit, push e pull requests com a integração Git.
  • Entender configuração por ambiente com variáveis e overrides de Declarative Automation Bundles (antigos Databricks Asset Bundles) para promover o mesmo código entre dev, test e prod.
  • Usar Declarative Automation Bundles para empacotar, configurar e promover Lakeflow Jobs, pipelines declarativos e outros ativos entre ambientes.
  • Usar a Databricks CLI para validar, implantar e gerenciar bundles e outros ativos em CI/CD automatizado.

Git folders

Clone de um repositório Git dentro do workspace. Pela UI você cria/troca branch, faz commit & push, pull e abre o PR no provedor (GitHub, Azure DevOps, GitLab…). Cada pessoa trabalha no seu Git folder e na sua branch.

Declarative Automation Bundles (DABs)

Infra + código como arquivos versionados. O coração é o databricks.yml:

bundle:
  name: vendas_etl

variables:
  catalogo:
    default: dev_catalog

resources:
  jobs:
    vendas_diario:
      name: vendas-diario-${bundle.target}
      tasks:
        - task_key: ingestao
          notebook_task:
            notebook_path: ./src/ingestao.py
            base_parameters:
              catalogo: ${var.catalogo}

targets:
  dev:
    mode: development       # prefixa recursos com [dev usuario], pausa agendas
    default: true
  prod:
    mode: production
    variables:
      catalogo: prod_catalog
    workspace:
      host: https://empresa-prod.cloud.databricks.com

O fluxo na CLI

databricks bundle validate -t prod   # checa sintaxe e referências
databricks bundle deploy   -t prod   # cria/atualiza jobs, pipelines, etc.
databricks bundle run vendas_diario -t prod
databricks bundle destroy  -t dev    # remove o que o bundle criou

Num pipeline de CI (GitHub Actions, Azure DevOps): PR → validate + testes → merge → deploy -t prod com um service principal.

Por que bundles e não "copiar notebook"

Mesmo código em todos os ambientes, diferenças só nos targets/variáveis, histórico no Git, deploy reproduzível e revisável.

Pegadinhas comuns

  • mode: development renomeia recursos e pausa agendamentos — não é para prod.
  • Variáveis definem valores por target; não duplique o job inteiro por ambiente.

Documentação:Git foldersDeclarative Automation BundlesDatabricks CLI

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

Troubleshooting, monitoramento e otimização

Objetivos oficiais

  • Identificar tendências de desempenho no histórico de execuções do Lakeflow Jobs, comparando com a linha de base.
  • Monitorar a saúde do pipeline na UI do Lakeflow Jobs: status, grafo de tarefas para achar bloqueios, tempos e taxa de falha.
  • Identificar gargalos como data skew, shuffle e spill para disco interpretando métricas por stage na Spark UI.
  • Entender os recursos de Liquid Clustering e predictive optimization.
  • Diagnosticar falhas de inicialização de cluster, conflitos de biblioteca e falta de memória (OOM).

Lendo a Spark UI

  • Skew: na aba Stages, Summary Metrics com Max muito maior que Median (ex.: median 400 MB, max 5 GB de shuffle read) → uma task demora muito mais que as outras. Solução: AQE com skew join (ligado por padrão), salting, ou filtrar a chave quente.
  • Shuffle alto: muitos dados trocados entre executores (joins/groupBy). Reduza com broadcast join, filtrando antes, ou Liquid Clustering.
  • Spill (memory/disk): partição não cabe na memória → mais partições, mais memória, ou corrigir o skew.

Histórico do job

A visão de runs mostra duração por execução: compare a execução atual com a mediana histórica. O grafo mostra qual tarefa falhou/atrasou e quem ficou esperando ("upstream blocker").

Liquid Clustering e Predictive Optimization

CREATE TABLE main.silver.eventos (...) CLUSTER BY (cliente_id, data_evento);
ALTER TABLE main.silver.eventos CLUSTER BY AUTO;   -- a Databricks escolhe as chaves
OPTIMIZE main.silver.eventos;                       -- reorganiza incrementalmente
  • Substitui partição + ZORDER; chaves podem mudar sem reescrever a tabela.
  • Predictive optimization (tabelas gerenciadas do UC) roda OPTIMIZE, VACUUM e ANALYZE automaticamente quando vale a pena.

Erros clássicos

SintomaCausa provávelO que fazer
Cluster não sobeCota/capacidade da nuvem, init script falhando, permissãoVer event log do cluster e logs do init script
ModuleNotFoundError / versão erradaConflito de bibliotecasFixar versões, usar environments do serverless, instalar no escopo certo
OutOfMemoryError no drivercollect()/toPandas() grande, broadcast enormeEvitar trazer dados ao driver, aumentar memória do driver
OOM / spill no executorPartições grandes ou skewMais partições, AQE, instância com mais memória

Pegadinhas comuns

  • Aumentar o cluster não resolve skew: a task gigante continua sendo uma só.
  • Diminuir spark.sql.shuffle.partitions com skew piora: concentra ainda mais dados por task.

Documentação:Spark UI e diagnósticoLiquid ClusteringPredictive optimization

Seção 7 · 15% · ≈ 7 questões

Governança e segurança

Objetivos oficiais

  • Diferenciar tabelas gerenciadas e externas no Unity Catalog e fazer operações básicas (criar, alterar, excluir e converter entre gerenciada e externa).
  • Configurar controle de acesso pela UI e por SQL com GRANT, REVOKE e DENY para principais (usuários, grupos e service principals) no nível certo da hierarquia.
  • Entender mascaramento de coluna e segurança em nível de linha para restringir dados por grupo.
  • Entender as políticas ABAC do Unity Catalog para controlar de forma central filtros de linha e máscaras de coluna.

Gerenciada x externa

GerenciadaExterna
Onde ficam os arquivosLocal gerenciado pelo UC (do catálogo/schema)Um LOCATION que você define
DROP TABLERemove metadados e dados (recuperáveis por 7 dias com UNDROP)Remove só os metadados; arquivos ficam
Otimizações automáticasSim (predictive optimization)Não
CREATE TABLE main.silver.clientes (id BIGINT, nome STRING);            -- gerenciada
CREATE TABLE main.raw.logs (linha STRING) LOCATION 's3://bucket/logs';  -- externa
ALTER TABLE main.raw.logs SET MANAGED;                                  -- externa → gerenciada

Hierarquia e privilégios

metastore → catálogo → schema → tabela/view/volume/função. Para ler uma tabela é preciso:

GRANT USE CATALOG ON CATALOG main TO `analistas`;
GRANT USE SCHEMA  ON SCHEMA  main.gold TO `analistas`;
GRANT SELECT      ON SCHEMA  main.gold TO `analistas`;   -- herdado por todas as tabelas, inclusive futuras
REVOKE SELECT ON TABLE main.gold.salarios FROM `analistas`;

Privilégios concedidos num nível são herdados pelos objetos abaixo. Conceda a grupos, não a pessoas. Jobs em produção rodam como service principal.

Filtros de linha e máscaras de coluna

CREATE FUNCTION main.seg.so_minha_regiao(regiao STRING)
RETURN is_account_group_member('admins') OR regiao = current_user_region();

ALTER TABLE main.gold.vendas SET ROW FILTER main.seg.so_minha_regiao ON (regiao);

CREATE FUNCTION main.seg.mascara_email(email STRING)
RETURN CASE WHEN is_account_group_member('rh') THEN email ELSE '***' END;

ALTER TABLE main.gold.clientes ALTER COLUMN email SET MASK main.seg.mascara_email;

ABAC

Em vez de aplicar a máscara tabela por tabela, você marca colunas com governed tags (ex.: pii = email) e cria uma política no catálogo/schema: "toda coluna com a tag pii usa a máscara X para quem não é do grupo Y". Vale para tabelas atuais e futuras.

Pegadinhas comuns

  • SELECT na tabela sem USE CATALOG e USE SCHEMA não basta.
  • DROP de tabela externa não apaga os arquivos.
  • ABAC é a resposta quando a pergunta fala em 'centralmente', 'centenas de tabelas' ou 'tabelas futuras'.

Documentação:Tabelas gerenciadas e externasPrivilégios do Unity CatalogFiltros de linha e máscarasABAC

Treinamentos recomendados pela Databricks

  • Instrutor: Data Engineering with Databricks
  • Academy: Data Ingestion with Lakeflow Connect
  • Academy: Deploy Workloads with Lakeflow Jobs
  • Academy: DevOps Essentials for Data Engineering
  • Academy: Data Interoperability with Unity Catalog
  • Academy: Build Data Pipelines with Lakeflow Spark Declarative Pipelines
  • Academy: Get Started with Data Governance on Databricks
Guia do exame Data Engineer Associate · Lucas Lessa