Databricks Data Engineer Associate Practice Exam
Databricks Certified Data Engineer Associate
The Databricks Certified Data Engineer Associate certification validates the skills to perform foundational data engineering tasks on the Databricks Platform. The exam covers seven sections: Databricks Intelligence Platform (6%), Data Ingestion and Loading (21%), Data Transformation and Modeling (22%), Working with Lakeflow Jobs (16%), Implementing CI/CD (10%), Troubleshooting, Monitoring, and Optimization (10%), and Governance and Security (15%). Questions test COPY INTO, Auto Loader, Lakeflow Connect, PySpark and SQL transformations, job orchestration, Declarative Automation Bundles and Unity Catalog. This practice exam mirrors that style with scenario-based single-answer questions.
Question bank updated : questions, answers, explanations and chapters.
Certification Overview
- Exam name: Data Engineer Associate
- Vendor: Databricks
- Duration: 90 minutes
- Total questions: about 45
- Our practice exam pass mark: 70%
Who Should Take This Exam?
Data Engineer, Databricks Developer, ETL Developer, Analytics Engineer, Big Data Engineer, Data Platform Engineer, Cloud Data Engineer, BI Developer
Prerequisites
No formal prerequisite. Databricks recommends six months of hands-on experience on the Databricks Platform with the tasks in the exam guide, and the Data Engineering with Databricks course.
Topics Covered
- Databricks Intelligence Platform
- Data Ingestion and Loading
- Data Transformation and Modeling
- Working with Lakeflow Jobs
- Implementing CI/CD
- Troubleshooting, Monitoring, and Optimization
- Governance and Security
Question Types
- Multiple Choice (Single Answer)
Data Engineer Associate Practice Questions
Our question bank contains 598+ practice questions for this certification. Sample questions from each exam chapter. Expand a question to see the answer choices. With full access, you get unlimited practice exams with randomized questions from our full question bank.
Databricks Intelligence Platform
To reference a table in a notebook by its full Unity Catalog name, which format identifies the table?
- A. metastore.schema.table
- B. workspace.catalog.table
- C. catalog.schema.table Correct answer
- D. schema.catalog.table
Option C is correct because Unity Catalog uses a three-level namespace: catalog, then schema, then table, written catalog.schema.table. Option A puts the metastore where the catalog belongs, since the metastore is the top-level container and is not part of the table name. Options B and D use the wrong levels or the wrong order.
A company runs a classic compute cluster in its own cloud account. Where do the Spark driver and worker nodes of that cluster run?
- A. In the workspace storage layer, inside the Databricks-managed root bucket
- B. In the serverless compute plane, inside the Databricks account
- C. In the compute plane, inside the customer's cloud account Correct answer
- D. In the control plane, inside the Databricks-managed cloud account
Option C is correct because classic compute runs in the compute plane, which sits inside the customer's own cloud account. The control plane in Option D holds the Databricks-managed backend services such as the web application and job scheduler, not the cluster nodes. Option B describes serverless compute, which is a different offering from classic compute. Option A confuses the root storage bucket with where Spark processes run.
Which storage layout makes up a Delta Lake table on cloud object storage?
- A. Parquet data files plus a transaction log in a _delta_log folder Correct answer
- B. Avro data files plus a schema registry kept in a _schema folder
- C. JSON data files plus a set of offsets kept in a _checkpoint folder
- D. ORC data files plus a manifest of file paths in a _manifest folder
Option A is correct because a Delta Lake table is a set of Parquet data files plus a transaction log stored in the _delta_log folder. The log records every commit and is what gives Delta its ACID guarantees and time travel. Options B, C and D name file formats and folders that Delta does not use for its table layout; _checkpoint, for example, is a Structured Streaming folder.
Data Ingestion and Loading
A scheduled job runs a COPY INTO statement that loads CSV files from a cloud storage folder into a Unity Catalog table. After a job failure, the engineer reruns the same statement while the folder holds the earlier files plus new ones. What does the rerun do?
- A. It reloads all files in the folder and duplicates the earlier rows
- B. It fails until the target table is truncated before the rerun
- C. It loads the new files and needs a checkpoint location to skip the earlier ones
- D. It loads the new files and skips the files that were already loaded Correct answer
Option D is correct because COPY INTO keeps track of the files it has already loaded, so rerunning the same statement loads only the new files and skips the earlier ones, which makes it safe to retry. Option A would only happen if that tracking did not exist. Option B is wrong because no truncation is needed, and option C is wrong because COPY INTO does not use a checkpoint location (that belongs to Auto Loader and streaming).
An Auto Loader stream runs inside a Lakeflow Jobs task and reads JSON files, with a schema location set, the default schema evolution mode, and mergeSchema set to true on the Delta write. The task has one retry configured. A source file arrives with a new field that is not in the stored schema. What is the outcome?
- A. The first attempt succeeds and the new column is added to the table with no failure
- B. The first attempt fails on the new field and the retry succeeds with the column added to the table Correct answer
- C. The first attempt fails and the retry fails too until the schema hints are edited manually
- D. The first attempt succeeds and the new field's values are stored in the _rescued_data column
Option B is correct because with the default schema evolution mode the stream stops with an error when it meets a new field, after updating the stored schema at the schema location. The retry then starts with the updated schema, and mergeSchema on the Delta write lets the table gain the new column. Option A is wrong because the first attempt does fail. Option C is wrong because the schema was already updated, so no manual edit is needed. Option D describes rescue mode, which is not the default.
Files land continuously in cloud storage, the file count is expected to reach millions, and new columns appear in the data from time to time. A data engineer must load the files incrementally into a Unity Catalog table. Which approach fits these requirements?
- A. A scheduled COPY INTO statement with the mergeSchema copy option
- B. Structured Streaming with the file source and a hand-maintained schema
- C. Auto Loader with schema evolution enabled and a schema location Correct answer
- D. A scheduled notebook that lists the folder and reads files newer than the last run
Option C is correct because Auto Loader is built for continuous incremental file ingestion at very large file counts and supports schema evolution through a schema location. Option A can handle new columns, but COPY INTO is better suited to smaller file counts. Option B requires a hand-maintained schema, so new columns would break it. Option D leaves file tracking and schema handling to custom code.
Data Transformation and Modeling
A join between a 2 TB transactions DataFrame and a 5 MB lookup DataFrame on one key causes a large shuffle of the transactions data in the Spark UI. Which change avoids shuffling the large DataFrame?
- A. Cache the transactions DataFrame before running the join
- B. Wrap the lookup DataFrame in broadcast() in the join call Correct answer
- C. Repartition the transactions DataFrame by the join key before joining
- D. Change the inner join to a cross join and filter on the key afterward
Option B is correct because broadcasting the 5 MB lookup DataFrame sends a copy to every executor, so the join happens locally and the 2 TB DataFrame is not shuffled. Option A only caches data and does not remove the shuffle. Option C itself triggers a shuffle of the large DataFrame. Option D makes the join more expensive.
An events DataFrame can hold several rows per event_id with different updated_at values. A data engineer must keep the most recent row for each event_id in the silver table. Which approach is reliable?
- A. Use row_number over a window partitioned by event_id and ordered by updated_at descending, then keep row 1 Correct answer
- B. Call distinct() on the full DataFrame to remove the repeated event_id values
- C. Sort by updated_at descending and then call dropDuplicates on event_id
- D. Group by event_id and select first(updated_at) next to the other columns
Option A is correct because row_number over a window partitioned by event_id and ordered by updated_at descending gives a deterministic ranking, and keeping row 1 returns the latest row per event. Option B only removes rows that are identical in every column, so several rows per event_id remain. Option C is unreliable because dropDuplicates does not guarantee which row it keeps after a sort. Option D picks values per column independently, so the result does not correspond to the latest row.
A silver table is changed by daily MERGE statements that update and delete rows. A data engineer must publish a gold daily-revenue aggregate for a dashboard that stays fast and reflects the updated and deleted rows after each daily refresh. Which object fits?
- A. A Delta table rebuilt by a daily job that appends the new aggregates
- B. A standard view that aggregates the silver table at query time
- C. A streaming table that reads the silver table and is refreshed daily
- D. A materialized view defined over the silver table and refreshed daily Correct answer
Option D is correct because a materialized view stores the precomputed aggregate, so dashboard queries are fast, and each refresh recomputes the result to reflect the updates and deletes made by MERGE. Option A only appends and so cannot reflect updates or deletes. Option B recomputes at every query, which is not fast. Option C is wrong because a streaming table expects an append-only source, and MERGE updates and deletes on the silver table break that requirement.
Working with Lakeflow Jobs
A Lakeflow Jobs job runs an extract task with two retries, followed by a condition task that checks a row-count output. The true branch runs load_full and the false branch runs load_skip. The condition task uses the default run-if setting, and extract fails on all three attempts. What happens?
- A. The condition task is retried two times before the branch tasks are evaluated
- B. The condition task runs with a null row count and sends the run down load_skip
- C. The condition task evaluates to false, so load_skip runs and the run succeeds
- D. The condition task and both branch tasks do not run, and the run ends as failed Correct answer
Option D is correct because the condition task uses the default run-if setting, which requires all upstream tasks to succeed. Once extract has failed on all attempts, the condition task is not run and neither are the branch tasks, and the run ends as failed. Option A is wrong because retries apply to the failing task, not to downstream tasks. Options B and C are wrong because the condition task never runs, so it produces no value and no branch is chosen.
Another group's pipeline updates a Unity Catalog table at irregular times during the day. A data engineer wants a Lakeflow Jobs job to refresh dependent gold tables soon after each update and to skip runs when the table has not changed. Which trigger type meets this?
- A. A scheduled trigger that runs every five minutes
- B. A continuous trigger that restarts the job after each run completes
- C. A table update trigger that watches the upstream table Correct answer
- D. A file arrival trigger on the upstream table's storage location
Option C is correct because a table update trigger watches a Unity Catalog table and starts the job after the table is updated, and it does not start a run when the table has not changed. Option A runs on a fixed clock whether or not the table changed. Option B reruns the job continuously regardless of the upstream table. Option D reacts to new files in a storage location, not to updates of a table.
A Lakeflow Jobs job has five notebook tasks in a chain. The third task fails once because of a transient network error, and its retry policy allows two retries. Which behavior does the retry policy produce?
- A. The third task is marked skipped and task four runs against the output that task two produced
- B. The job restarts at task one and discards the completed results of tasks one and two before the retry
- C. The third task starts again from its beginning while tasks one and two keep their completed results Correct answer
- D. The third task resumes from its last completed notebook cell by reading a saved execution checkpoint
Option C is correct because a task retry reruns only the failed task from its beginning, and the completed upstream tasks keep their results. The job does not restart at task one (B), the task is not marked skipped (A), and a notebook does not resume from a saved cell checkpoint (D).
Implementing CI/CD
A bundle's databricks.yml declares a variable named catalog with the default value dev_catalog, and the prod target overrides it with prod_catalog. A data engineer deploys with databricks bundle deploy -t prod --var="catalog=qa_catalog". Which catalog does the deployed job use?
- A. prod_catalog, because a target override outranks a value from the command line
- B. dev_catalog, because the default value is used when the bundle is deployed
- C. The deploy fails, because the variable is already set in the prod target
- D. qa_catalog, because the --var value outranks the target override and the default Correct answer
Option D is correct because a value passed with --var on the command line has the highest precedence, above a target override and above the default. The deploy therefore uses qa_catalog. Option A reverses the order of the first two. Option B ignores both the override and the command-line value. Option C is wrong because a target can override a variable and a command-line value can still replace it without error.
A data engineer must deploy a bundle that defines a job named nightly_job to the prod target and then start the job. Which commands do this?
- A. databricks bundle deploy -t prod, then databricks bundle run -t prod nightly_job Correct answer
- B. databricks bundle sync -t prod, then databricks bundle run -t prod nightly_job
- C. databricks bundle init -t prod, then databricks bundle run -t prod nightly_job
- D. databricks bundle validate -t prod, then databricks bundle run -t prod nightly_job
Option A is correct because databricks bundle deploy -t prod deploys the bundle to the prod target, and databricks bundle run -t prod nightly_job then starts the deployed job. Option D validates the bundle configuration, which checks it for errors but deploys nothing, so the run command has no deployed job to start. Option C uses init, which creates a new bundle from a template. Option B uses sync, which copies local files to the workspace but does not create the job.
A production job runs notebooks from the main branch of a repository each night. A data engineer wants to try a new transformation in a Databricks Git folder without affecting that job. What should the engineer do?
- A. Clone the repository into a second Git folder and commit the new transformation straight to main there
- B. Pin the production job to the latest commit of main and keep editing on main in the Git folder
- C. Edit the notebook on main in the Git folder, then commit it and hold the push until the next morning
- D. Create a feature branch from main in the Git folder, then commit and push the changes to that branch Correct answer
Option D is correct because a feature branch keeps the new transformation off main, so the nightly job that runs main is unaffected until a reviewed merge. Committing straight to main in another Git folder (A) or editing main (B, C) puts the change on the branch the job uses.
Troubleshooting, Monitoring, and Optimization
A daily job runs df.groupBy('customer_id').agg(sum('amount')) on clickstream events, and adaptive query execution is enabled. In the Spark UI the aggregation stage has 200 tasks. Most finish in about 20 seconds, but one task runs for 25 minutes, reads about 40 times more shuffle data than the median task, and spills 30 GB to disk. One customer_id accounts for about a third of all rows. What is the most effective fix?
- A. Add a random salt column to the grouping key, then aggregate the partial results by customer_id Correct answer
- B. Increase spark.sql.shuffle.partitions from 200 to 2000 so the large key is split across more tasks
- C. Call repartition on customer_id before the groupBy so the rows are spread evenly across tasks
- D. Choose worker types with more memory per core so the large task stops spilling to disk
Option A is correct because all rows with the same customer_id are shuffled to one task, so one hot key creates one slow task. Salting the key first spreads that customer's rows over many tasks, and a second aggregation by customer_id combines the partial results. Adaptive query execution skew handling applies to joins, not to a groupBy aggregation, so it does not split this stage. Option B fails because a larger number of shuffle partitions still sends the one key to one partition. Option C fails for the same reason, since repartition by customer_id hashes every row of that key to the same task. Option D may reduce the spill but leaves the one slow task in place.
Which observation in a stage's task summary statistics in the Spark UI is the quickest signal of data skew?
- A. The stage contains more tasks than the cluster has available CPU cores
- B. All executors report the same count of completed tasks for the stage
- C. The stage takes longer to complete than the stage that ran just before it
- D. The maximum task duration and input size are many times the median values Correct answer
Option D is correct because skew means a few tasks get far more data than the rest, so the slowest task and the largest input in the stage's task statistics sit many times above the median. Option A describes a stage that needs several waves of tasks, which is normal. Option B and option C do not point at uneven data: equal task counts per executor say nothing about task size, and a stage can be slower than its predecessor simply because it does more work.
Which of these PySpark operations on an existing DataFrame forces a shuffle and starts a new stage in the Spark UI?
- A. df.select('region', 'total') on the same DataFrame with 200 partitions
- B. df.groupBy('region').sum('total') on the same DataFrame Correct answer
- C. df.filter(col('status') == 'ok') on a DataFrame with 200 partitions
- D. df.withColumn('total', col('qty') * col('price')) on the same DataFrame
Option B is correct because an aggregation by key must bring all rows with the same key together, which requires a shuffle and ends the stage. Select, filter and withColumn are narrow transformations: each output partition depends on one input partition, so they run inside the same stage without moving data between executors.
Governance and Security
After dropping a Unity Catalog external table, a data engineer creates a new external table over the same storage location with the same format. What does a query on the new table return?
- A. An error, since Unity Catalog blocks a new table on a path an earlier table used
- B. All the original rows, since dropping an external table leaves its files in place Correct answer
- C. No rows, since dropping the table deleted the data files at its storage location
- D. No rows, since UNDROP TABLE must first restore the dropped table within its recovery window
Option B is correct because dropping an external table removes only its metadata from Unity Catalog and leaves the data files in the storage location. A new external table created over the same location and format reads those files and returns the original rows. Option C describes a managed table drop, where Unity Catalog manages the files. Option A is wrong because the drop removes the table's registration, so the path can be used again. Option D is wrong because the files were never deleted, so no restore step is needed.
Members of the analysts group must see full email addresses in a customers table, while all other users see a masked value. Users must keep querying the table by its current name. Which approach meets these requirements?
- A. Grant SELECT on the table to analysts and revoke it from all other groups
- B. Set a row filter function on the table that returns false for users outside analysts
- C. Create a dynamic view over the table that masks email and point all queries at it
- D. Attach a column mask function to email that checks is_account_group_member for analysts Correct answer
Option D is correct because a column mask function attached to the email column returns the full value when is_account_group_member shows the user is in analysts and a masked value otherwise, while users keep querying the same table name. Option A controls access to the whole table instead of masking one column. Option B filters rows, not column values. Option C forces everyone to switch to a different object name.
Free Study Guide
Read the free Databricks Data Engineer Associate study guide: every exam topic explained in plain English, with diagrams, exam tips and the mistakes to avoid.
Practice with realistic mock exams to prepare for your Databricks certification.