Study guideFree sample of Pro

Databricks Data Engineer Associate

Every domain of the Databricks Data Engineer Associate exam explained, with decision tables, runnable SQL and PySpark, diagrams and the traps the questions set, following the May 2026 exam guide.

Aligned to the May 2026 exam guide · checked against the Databricks docs on 31 October 2026 · certlake.com/exam/data-engineer-associate/study-guide

New to this exam? Read the overview.

Exam at a glance

Questions45 scored, multiple choice (plus up to 10 unscored)
Time90 minutes
Pass markNot published by Databricks; practise to 70% or better
LanguagesPython (PySpark) and SQL
Exam guideMay 2026 (exam version effective 4 May 2026)
DomainWeight≈ Questions
Data Transformation and Modeling22%10 questions
Data Ingestion and Loading21%9
Working with Lakeflow Jobs16%7
Governance and Security15%7
Implementing CI/CD10%4–5
Troubleshooting, Monitoring, and Optimization10%4–5
Databricks Intelligence Platform6%3

1. Databricks Intelligence Platform6% of the exam

Delta Lake gives tables ACID transactions, time travel (VERSION AS OF, TIMESTAMP AS OF), schema enforcement and an audit history (DESCRIBE HISTORY). Unity Catalog governs data and AI assets with one three-level namespace: catalog.schema.table.

How the pieces fit

Data flow: sources are ingested into bronze, cleaned into silver, aggregated into gold for BI, all governed by Unity CatalogCloud storageS3 · ADLS · GCSCOPY INTO · Auto LoaderSaaS & databasesSalesforce, SQL ServerLakeflow ConnectOther sourcesJDBC · ODBC · RESTNotebook in a jobBronzeraw, as ingested (often streaming tables)clean · cast · dedupe · expectationsSilvercleaned, validated, conformedjoin · aggregate · modelGoldmaterialized views · views · tables for BIBI dashboards · SQL warehouses · ML and AIUnity Cataloggoverns everylayer

Pick the compute

ComputeUse it forWatch out for
Serverless (notebooks, jobs, pipelines)Most new work: starts in seconds, no cluster to configureLess control over Spark configuration and libraries
Jobs computeScheduled production jobs on classic computeCreated for the run and terminated after it
All-purpose computeInteractive development and ad hoc analysisHigher DBU rate than jobs compute; don't run production jobs on it
SQL warehouse (serverless, pro, classic)SQL queries, dashboards and BI toolsSQL only; serverless starts fastest and scales for many concurrent users

Classic compute has two access modes: standard (formerly shared: many users, Unity Catalog isolation) and dedicated (formerly single user: needed for ML runtimes, GPUs, R and RDD APIs). Older questions may say high concurrency for a multi-user cluster.

Cost: compute is billed in DBUs (Databricks Units) per hour. Serverless charges only while it runs, with no idle cost; classic compute charges for as long as it's up, so use autoscaling and auto-termination. Jobs compute has a lower DBU rate than all-purpose compute.

2. Data Ingestion and Loading21% of the exam

Pick the ingestion method

SituationUse
Files landing in cloud storage, thousands over time, SQL usersCOPY INTO
Files landing in cloud storage, millions over time, or schema driftAuto Loader (cloudFiles)
SaaS apps (Salesforce, Workday, …) or databases (SQL Server, MySQL, PostgreSQL) with CDCLakeflow Connect managed connectors
A source with no managed connectorSQL and Spark APIs, partner connectors, or JDBC/ODBC/REST from a notebook, scheduled with Lakeflow Jobs
A one-off local fileThe Add data UI, uploading to a Unity Catalog volume or table

Managed connectors run as Unity Catalog–governed pipelines on serverless compute, and handle authentication, CDC, retries and schema evolution for you.

COPY INTO

COPY INTO main.sales.orders_bronze
FROM 's3://landing/orders/'
FILEFORMAT = JSON
FORMAT_OPTIONS ('inferSchema' = 'true')
COPY_OPTIONS ('mergeSchema' = 'true');
  • Idempotent: files already loaded are skipped on the next run, so it's safe to schedule.
  • COPY_OPTIONS ('force' = 'true') reloads files that were already loaded.

Auto Loader

chk = "/Volumes/main/sales/raw/_chk/orders"

(spark.readStream
    .format("cloudFiles")
    .option("cloudFiles.format", "json")
    .option("cloudFiles.schemaLocation", chk)
    .load("s3://landing/orders/")
  .writeStream
    .option("checkpointLocation", chk)
    .trigger(availableNow=True)  # all new files, then stop
    .toTable("main.sales.orders_bronze"))
  • File detection: directory listing (default, no extra setup) or file notification (recommended; use it with file events on the external location). Both give exactly-once processing.
  • Schema inference: JSON, CSV and XML columns are inferred as strings unless you set cloudFiles.inferColumnTypes or add cloudFiles.schemaHints. The inferred schema is stored at cloudFiles.schemaLocation.
  • _rescued_data collects values that don't fit the schema instead of dropping them.
cloudFiles.schemaEvolutionModeOn a new column
addNewColumns (default without a schema)Adds it, then fails the stream; a restart picks it up
rescueNever changes the schema; new columns go to _rescued_data
failOnNewColumnsFails until you update the schema or remove the file
none (default when you give a schema)Ignores new columns

Semi-structured data

-- Path into a JSON string column
SELECT payload:customer.id AS customer_id
FROM main.sales.orders_bronze;

-- Parse a JSON array, then one row per element
SELECT explode(
  from_json(items, 'ARRAY<STRUCT<sku STRING, qty INT>>')
) AS item
FROM main.sales.orders_bronze;

3. Data Transformation and Modeling22% of the exam

Bronze to silver cleaning

from pyspark.sql import functions as F

silver = (spark.read.table("main.sales.orders_bronze")
    .dropna(subset=["order_id"])
    .fillna({"country": "unknown"})
    .withColumn("amount", F.col("amount").cast("double"))
    .withColumn("order_date", F.to_date("order_ts"))
    .withColumnRenamed("cust", "customer_id")
    .dropDuplicates(["order_id"]))

(silver.write.mode("overwrite")
    .saveAsTable("main.sales.orders_silver"))

Other row and column moves: filter/where, drop, split, explode (one row per array element).

Joins and unions

OperationBehaviour
df.join(other, "id", "inner")Rows with a match on both sides
"left"Every left row; nulls where the right side has no match
df.join(other, ["id", "date"])Join on several keys
F.broadcast(small_df)Ships the small table to every executor, so the large side isn't shuffled
crossJoinEvery combination: rows × rows
df.union(other) / unionAllAppends rows by position and keeps duplicates (SQL UNION ALL)
df.unionByName(other)Appends rows by column name
SQL UNIONRemoves duplicates; UNION ALL keeps them

Aggregations

groupBy().agg(F.count, F.sum, F.mean, F.countDistinct, F.approx_count_distinct). approx_count_distinct is faster on large data and accepts a small error. df.describe() gives count, mean, stddev, min and max; df.summary() adds the 25/50/75% percentiles.

Tuning parameters

SettingDefaultWhat it controls
spark.sql.shuffle.partitions200Partitions after a shuffle (joins, aggregations)
spark.sql.autoBroadcastJoinThreshold10 MBTables below this size are broadcast automatically
spark.databricks.adaptive.autoBroadcastJoinThreshold30 MBThe same, decided at runtime by adaptive query execution on Databricks
spark.default.parallelismTotal coresDefault partitions for RDD operations
spark.executor.memory / spark.driver.memoryNode-type dependentMemory per executor and for the driver

Adaptive query execution (on by default) coalesces small shuffle partitions and splits skewed ones at runtime. Change one setting at a time and re-measure.

Gold objects

ObjectStores data?Best for
ViewNo: query runs each timeLight logic; hiding rows or columns
Materialized viewYes: precomputed, refreshed (incrementally if possible)Aggregates for BI
Streaming tableYes: each new source row processed onceAppend-only sources (bronze, silver)
TableYes: you control the writesAnything you MERGE or overwrite

Data quality

Expectations in Lakeflow pipelines:

CREATE OR REFRESH STREAMING TABLE orders_silver (
  CONSTRAINT valid_id EXPECT (order_id IS NOT NULL)
    ON VIOLATION DROP ROW,
  CONSTRAINT valid_amount EXPECT (amount >= 0)
    ON VIOLATION FAIL UPDATE,
  CONSTRAINT recent EXPECT (order_date >= '2020-01-01')
) AS SELECT * FROM STREAM(orders_bronze);
ActionPythonBad rows
Warn (default)@dp.expectKept and counted in metrics
DROP ROW@dp.expect_or_dropRemoved before writing
FAIL UPDATE@dp.expect_or_failStop the update

Outside pipelines, Delta CHECK constraints (ALTER TABLE … ADD CONSTRAINT … CHECK (…)) reject bad writes.

4. Working with Lakeflow Jobs16% of the exam

A job is a DAG of tasks: notebook, Python script, SQL query, dashboard, pipeline, Run Job and more. Each task can set retries, a timeout and notifications.

A job with branching and Run if

Lakeflow Job DAG: ingest, an if/else check, transform and publish on the true branch, an alert task that runs if at least one upstream task failed, and a clean-up task that runs when all are doneingestretries: 2If/elsenew rows?transformAll succeededpublishAll succeededalertAt least one failedclean_upAll donetruefalse: skip
The grey line under each task is its Run if condition; All succeeded is the default. Skipped (Excluded) tasks count as successful when the next task checks its Run if.

Control-flow features

FeatureDoes
Depends on + Run ifRun a task based on its upstream tasks' results
If/else condition taskBranch on a boolean expression, e.g. only transform when ingestion added rows
For each taskLoop a nested task over an array, optionally in parallel (default concurrency 1)
Run Job taskTrigger another job
Repair runRe-run the failed tasks plus the tasks that depend on them; you can choose which

Run if conditions

Run ifRuns when
All succeeded (default)Every dependency succeeded
At least one succeededAny dependency succeeded
None failedNo dependency failed and at least one ran
All doneEvery dependency finished, whatever the result
At least one failedAny dependency failed
All failedEvery dependency failed

Triggers

TriggerStarts a run when
ScheduledA cron-style time arrives
File arrivalNew files land in a Unity Catalog volume or external location
Table updateSource tables are updated
ContinuousThe previous run ends (always running)
Manual / APISomeone or something calls Run now

Use a time-based trigger when data arrives on a fixed timetable or consumers expect a set refresh time. Use a data-driven trigger (file arrival, table update) when arrival is irregular, to avoid empty runs and cut latency.

5. Implementing CI/CD10% of the exam

Git Folders

Git Folders clone a remote repo into the workspace: create and switch branches, pull, commit and push from the UI. Pull requests are opened, reviewed and merged in your Git provider.

Bundle configuration

Declarative Automation Bundles describe jobs, pipelines and other resources as YAML (databricks.yml) alongside the code, so one codebase deploys to dev, test and prod.

bundle:
  name: orders

variables:
  catalog:
    default: dev_catalog

targets:
  dev:
    mode: development   # "[dev you]" prefix, paused schedules
    default: true
  prod:
    mode: production
    variables:
      catalog: prod_catalog   # per-target override

Reference a variable as ${var.catalog}. Set it per target (as above), with --var="catalog=…", or with a BUNDLE_VAR_catalog environment variable.

Promote dev → test → prod

Bundle promotion: the same databricks.yml in Git is validated, then deployed to dev, test and prod targets with per-target variablesGit repodatabricks.yml + codebundle validatedatabricks bundle deploy -t devmode: development · catalog = devdatabricks bundle deploy -t testcatalog = testdatabricks bundle deploy -t prodmode: production · catalog = prod
One codebase, one databricks.yml. Targets override variables such as ${var.catalog}; development mode prefixes resource names and pauses schedules.
CLI commandDoes
databricks bundle validateChecks the configuration
databricks bundle deploy -t prodDeploys to a target
databricks bundle run -t prod orders_jobRuns a deployed job or pipeline by its resource key
databricks bundle destroy -t devRemoves what the bundle deployed

In CI/CD, run these commands authenticated as a service principal, not a user, so deployments don't depend on one person's account.

6. Troubleshooting, Monitoring, and Optimization10% of the exam

Spark UI bottlenecks

Open the slowest stage and read its task summary (min, median, max).

Spark UI skew: eleven tasks take about 25 seconds and one takes ten minutesTask duration, slowest stagemedian ≈ 25 s1 task: 10 minshuffle read 5 GB vs 400 MBtasks →
Max far above the median means skew. More nodes won't help, because one core still runs the giant partition. Use adaptive query execution's skew join handling, or salt the key.
Symptom in the stageProblemFix
Max task time or shuffle read far above the medianData skewAdaptive query execution skew join handling; salting as a fallback
Large shuffle read and writeWide transformationsBroadcast small tables, filter early, cluster on join keys
Spill (memory/disk) above zeroPartitions too big for memorySmaller partitions (more shuffle partitions), or more memory per executor

Monitor jobs

The job's runs view compares durations and outcomes over time, so a run that is suddenly twice as slow stands out. A run's task graph shows which upstream task blocked or failed, and repair re-runs just the failed part.

Data layout

  • Liquid clustering (CLUSTER BY (col, …) or CLUSTER BY AUTO) replaces partitioning and ZORDER. You can change keys without rewriting data, and OPTIMIZE clusters new data incrementally. It isn't compatible with partitioning or ZORDER on the same table.
  • Predictive optimization runs OPTIMIZE, VACUUM and ANALYZE automatically on Unity Catalog managed tables.

Cluster problems

SymptomUsual cause
Cluster won't startCloud quota or capacity, a failing init script or library install (see the event log)
Import errors, version clashesConflicting libraries: pin versions as compute-scoped libraries
Driver out of memorycollect() or toPandas() on large data
Executor out of memorySkew, or partitions too large: repartition or add memory

7. Governance and Security15% of the exam

Managed vs external tables

ManagedExternal
StorageUnity Catalog's managed locationA path you own (LOCATION 's3://…')
DROP TABLEData deleted after 7 days (UNDROP until then)Metadata only; files stay
Predictive optimizationYesNo

Convert external to managed with ALTER TABLE t SET MANAGED. It keeps the table's history and permissions, and UNSET MANAGED rolls it back within 14 days. Managed to external has no single command: copy the data into a new external table.

Privileges

Unity Catalog hierarchy: metastore, catalog, schema, then tables, views, volumes and functions, with the privilege needed at each levelMetastoreone per regionCataloge.g. mainUSE CATALOGSchemamain.salesUSE SCHEMATable / viewSELECT · MODIFYVolumeREAD VOLUMEFunctionEXECUTEcatalog.schema.object
Reading main.sales.orders needs USE CATALOG on main, USE SCHEMA on main.sales and SELECT on the table. A grant on a catalog or schema is inherited by everything inside it.
GRANT USE CATALOG ON CATALOG main TO `analysts`;
GRANT USE SCHEMA, SELECT ON SCHEMA main.sales TO `analysts`;
GRANT MODIFY ON TABLE main.sales.orders TO `etl-sp`;
REVOKE SELECT ON SCHEMA main.sales FROM `analysts`;
  • To read a table you need USE CATALOG on its catalog, USE SCHEMA on its schema, and SELECT on the table (or on the schema or catalog, which is inherited downwards).
  • Principals are users, groups and service principals. Grant to groups, and run production jobs as a service principal.

Row filters and column masks

-- Row filter: admins see everything, others only US rows
CREATE FUNCTION main.sec.us_only(region STRING)
  RETURN is_account_group_member('admins') OR region = 'US';
ALTER TABLE main.sales.orders
  SET ROW FILTER main.sec.us_only ON (region);

-- Column mask: only support sees real emails
CREATE FUNCTION main.sec.mask_email(email STRING)
  RETURN CASE WHEN is_account_group_member('support')
    THEN email ELSE '***' END;
ALTER TABLE main.sales.customers
  ALTER COLUMN email SET MASK main.sec.mask_email;

A table's own row filters and column masks are set by its owner. ABAC policies apply row filters and column masks centrally: you tag data with governed tags (e.g. pii = email), and a policy on a catalog, schema or table applies its UDF to every matching table or column, now and in future. Use ABAC when the same rule must cover many tables.

Know it, or just recognise it?

The free diagnostic shows which domains you'd lose marks on, in about 10 minutes and without signing up.

Take the free diagnostic

Cheat sheet

The two-page cheat sheet: rules, defaults and traps for the last week before the exam.

Open the cheat sheet

Spotted something out of date? Email support@certlake.com. CertLake is not affiliated with Databricks, Inc.