CertSafari

    Free Databricks Certified Data Engineer Associate Sample Questions

    35 free sample questions from our bank of 402+, covering every exam domain, with answers and detailed explanations. Updated September 2026.

    Domain 1: Databricks Intelligence Platform

    Subdomain 1.2: Understand Databricks Data Intelligence Platform’s compute services

    1.Several data scientists want to share one running cluster throughout the day so they can attach notebooks, run ad hoc exploratory queries, and install shared libraries without waiting for a new cluster to start each time. Which compute type fits this pattern?

    1. A.A job cluster, since Databricks provisions it fresh for each notebook attachment and automatically shares libraries across every user session.
    2. B.A serverless SQL warehouse, since it is designed for teams to attach notebooks directly and install custom Python libraries for exploration.
    3. C.A Classic SQL warehouse, since Classic warehouses allow notebook attachment and multi-user library installation during interactive sessions.
    4. D.An all-purpose cluster, since it stays available for multiple users to attach notebooks and share libraries across an interactive session.
    Show answer & explanation

    Correct answer: D — An all-purpose cluster, since it stays available for multiple users to attach notebooks and share libraries across an interactive session.

    • A. A job cluster is created for a single scheduled job run and terminates when that run finishes, so it does not stay available for multiple data scientists to attach notebooks throughout the day. It is not intended for shared, ongoing interactive use.
    • B. SQL warehouses are built to run SQL queries against Databricks SQL and do not support attaching general-purpose notebooks or installing arbitrary Python libraries for exploratory work. This makes them unsuitable for the described shared notebook workflow.
    • C. Like other SQL warehouse tiers, Classic warehouses serve SQL queries rather than hosting attached notebooks or arbitrary library installs, so they do not match the described interactive multi-user notebook workflow. Notebook attachment is a cluster capability, not a SQL warehouse one.
    • D. An all-purpose cluster is designed to remain running so multiple users can attach notebooks, share installed libraries, and run interactive exploratory queries without waiting for a fresh cluster to start. This directly matches the described collaborative workflow.

    Subdomain 1.1: Understand the core components of the Databricks Data Intelligence Platform

    2.A company runs three Databricks workspaces in the same AWS region for different business units and wants every workspace to enforce the same table permissions, lineage tracking, and audit logs without maintaining separate governance configuration in each workspace. What should they do?

    1. A.Attach a single Unity Catalog metastore to all three workspaces so grants, lineage, and audit logs apply consistently across them
    2. B.Create an identical set of catalogs and manually replicate every grant statement in each workspace's own separate metastore
    3. C.Configure a job cluster per workspace with matching cluster policies so that compute-level settings mirror the intended governance settings
    4. D.Enable a classic SQL warehouse in each workspace, since SQL warehouses independently enforce table-level access control
    Show answer & explanation

    Correct answer: A — Attach a single Unity Catalog metastore to all three workspaces so grants, lineage, and audit logs apply consistently across them

    • A. A single Unity Catalog metastore can be attached to multiple workspaces in the same region, so permissions, lineage, and audit logs defined once apply consistently across all attached workspaces.
    • B. Manually duplicating catalogs and grants across separate metastores per workspace creates ongoing maintenance overhead and drift risk, which is exactly what a shared metastore is meant to avoid.
    • C. Cluster policies control compute configuration such as instance types and autoscaling limits; they do not enforce data governance features like table grants, lineage, or audit logging.
    • D. SQL warehouses execute queries under whatever governance layer is attached to the workspace; they do not independently define or enforce catalog-level access control across workspaces.

    Domain 2: Data Ingestion and Loading

    Subdomain 2.3: Use Auto Loader with schema enforcement and schema evolution

    3.A data engineer wants Auto Loader to process all currently available files in a source directory and then stop on its own, rather than running continuously, so the workload can be scheduled as a Lakeflow Job that runs once per hour. Which configuration achieves this batch-style behavior?

    1. A.Configure the `writeStream` with `Trigger.AvailableNow`, which processes all files available at the start of the run and then stops the stream automatically.
    2. B.Configure the `writeStream` with no trigger specified at all, which causes Auto Loader to process one file per run and then exit without a checkpoint.
    3. C.Configure the `readStream` to omit `cloudFiles.schemaLocation`, which forces Auto Loader to treat the workload as a one-time batch load by default.
    4. D.Configure the `writeStream` with `Trigger.Continuous`, which processes files as they arrive and stops automatically once the source directory is empty.
    Show answer & explanation

    Correct answer: A — Configure the `writeStream` with `Trigger.AvailableNow`, which processes all files available at the start of the run and then stops the stream automatically.

    • A. `Trigger.AvailableNow` processes all files that are available when the job starts and then stops the stream once they are handled, which matches the hourly scheduled batch-style pattern the engineer wants.
    • B. Leaving the trigger unspecified does not produce a one-file-and-exit batch behavior; the default streaming trigger processes micro-batches continuously rather than stopping after one file.
    • C. Omitting the schema location does not turn a streaming job into a batch job; it only removes the location Auto Loader uses to persist and evolve the inferred schema, and is required for most formats to avoid errors.
    • D. `Trigger.Continuous` is designed for low-latency continuous processing and does not stop automatically when a directory becomes empty, which is the opposite of the stop-on-its-own behavior needed here.

    Subdomain 2.2: Use the COPY INTO command

    4.A source S3 bucket receives files from multiple upstream systems, and a data engineer wants a single `COPY INTO` run to ingest only the files under a `landing/2026/09/` prefix whose names end in `.csv`, ignoring `.json` and `.txt` files that land in the same prefix. Which clause should the engineer add to the statement?

    1. A.`PATTERN = 'landing/2026/09/*.csv'` so the command matches only files under that prefix whose names end with the `.csv` extension using glob-style matching.
    2. B.`FILES = ('landing/2026/09/*.csv')` so the command treats the entire glob expression as a single explicit filename and attempts to load only that one literal path.
    3. C.`FORMAT_OPTIONS ('extension' = 'csv')` so the command filters the format reader to only parse files that Spark identifies as CSV-formatted content.
    4. D.`FILEFORMAT = CSV` alone, since specifying the file format automatically restricts the command to loading only files with a matching extension.
    Show answer & explanation

    Correct answer: A — `PATTERN = 'landing/2026/09/*.csv'` so the command matches only files under that prefix whose names end with the `.csv` extension using glob-style matching.

    • A. This is correct. `PATTERN` accepts glob-style expressions, so restricting it to `*.csv` under the target prefix filters the source listing down to only the matching CSV files.
    • B. This is incorrect. `FILES` expects a list of explicit file names rather than a glob expression, and it cannot be combined with wildcard matching to select a subset of files by extension.
    • C. This is incorrect. There is no `extension` key recognized under `FORMAT_OPTIONS`; format options configure how a given file format is parsed, not which files are selected for the load.
    • D. This is incorrect. `FILEFORMAT` tells `COPY INTO` which parser to use for the selected files; it does not filter the source listing by file extension, so non-CSV files would still be attempted.

    Subdomain 2.1: Enable and detail data ingestion patterns

    5.A team needs to ingest data from a niche internal REST API that is not among the enterprise applications supported by Lakeflow Connect's managed connectors, and they need control over pagination, authentication headers, and retry logic in the extraction code. Which approach is most appropriate?

    1. A.A standard connector built as a custom Lakeflow Spark Declarative Pipeline, trading some automation for the flexibility to code custom extraction logic.
    2. B.A managed connector, which offers a simple UI and prebuilt API integration for any REST source regardless of whether it is officially supported by Lakeflow Connect.
    3. C.`COPY INTO`, which is designed to bulk-load files that are already staged in cloud object storage rather than call a live REST API endpoint directly.
    4. D.The Zerobus direct-write API, which is intended for individual applications writing records straight into Delta tables rather than polling an external REST API.
    Show answer & explanation

    Correct answer: A — A standard connector built as a custom Lakeflow Spark Declarative Pipeline, trading some automation for the flexibility to code custom extraction logic.

    • A. Building a standard connector as a custom pipeline gives the team direct control over pagination, authentication headers, and retry logic in the extraction code, which is the flexibility a niche unsupported source requires, at the cost of some of the automation a managed connector would otherwise provide.
    • B. A managed connector only supports a specific, prebuilt catalog of enterprise sources, so an unsupported niche REST API would not have a managed connector available for it regardless of the UI's simplicity.
    • C. This SQL command loads files that are already staged in cloud object storage and has no ability to call a live REST API directly to retrieve data from it.
    • D. This direct-write API is designed for applications to push individual records into Delta tables themselves, not for Databricks to poll and paginate through an external REST API on a schedule.

    Subdomain 2.4: Configure Lakeflow Connect to reliably ingest data

    6.While planning a managed connector rollout for a Google Analytics source, an engineer discovers that the connector is listed as not yet available in their workspace's cloud region. What should the engineer do based on how Databricks documents managed connector availability?

    1. A.Check Databricks' regional feature support documentation, since managed connectors are not universally available across every region and workspace.
    2. B.Assume this is a temporary outage affecting all regions equally and simply retry the connector setup again in a few minutes without further checks.
    3. C.Conclude that Google Analytics can never be ingested into Databricks and switch the entire ingestion strategy to a different analytics platform.
    4. D.Deploy the workspace's Unity Catalog metastore to a different region automatically, since metastore location is what determines connector availability.
    Show answer & explanation

    Correct answer: A — Check Databricks' regional feature support documentation, since managed connectors are not universally available across every region and workspace.

    • A. Databricks documents that managed connectors are not available in every region, so the correct next step is checking regional feature support documentation rather than assuming the feature is universally present.
    • B. Regional unavailability is a documented, standing limitation for some connectors, not a transient outage, so retrying without checking regional support docs is unlikely to resolve it.
    • C. A regional limitation does not mean the source can never be ingested; the connector may be available in a supported region, or a standard connector approach may still work.
    • D. Metastore location is a Unity Catalog governance concern and is not what Databricks documents as controlling managed connector regional availability.

    Subdomain 2.6: Prioritize between Auto Loader, Lakeflow Connect, and other ingestion methods

    7.A pipeline owner wants Auto Loader to never fail the stream when unexpected columns appear in incoming files, but also wants those unexpected values preserved rather than silently discarded. Which `cloudFiles.schemaEvolutionMode` setting satisfies both requirements?

    1. A.`rescue`, which prevents schema evolution and captures unexpected columns in the rescued data column instead of failing the stream.
    2. B.`none`, which ignores unexpected columns entirely and continues the stream without capturing their values anywhere.
    3. C.`addNewColumns`, which evolves the schema automatically but stops the stream once with an exception before resuming.
    4. D.`failOnNewColumns`, which halts the stream permanently until an updated schema is explicitly provided by the user.
    Show answer & explanation

    Correct answer: A — `rescue`, which prevents schema evolution and captures unexpected columns in the rescued data column instead of failing the stream.

    • A. The `rescue` mode is built exactly for this case: it blocks automatic schema evolution and instead captures unexpected column values in the rescued data column without ever failing the stream.
    • B. The `none` mode avoids failure but simply ignores unexpected columns, meaning their values are not preserved anywhere, which fails the second requirement.
    • C. The `addNewColumns` mode does preserve new columns by evolving the schema, but it still interrupts the stream with an exception, which fails the no-failure requirement.
    • D. The `failOnNewColumns` mode does the opposite of what is needed, halting the stream indefinitely until a person manually supplies an updated schema.

    Subdomain 2.6: Prioritize between Auto Loader, Lakeflow Connect, and other ingestion methods

    8.A data engineering team is designing an ingestion strategy for a new source system and is unsure whether to build a custom connector immediately. Following Databricks' recommended approach to selecting an ingestion method, what should they do first?

    1. A.Start with the most managed layer available, such as a managed connector, and drop to less-managed layers only if requirements aren't met.
    2. B.Start by building a fully custom connector first, then evaluate whether a managed connector could have replaced it later.
    3. C.Start with a community connector regardless of source support, since community connectors are the most cost-effective default choice.
    4. D.Start with Auto Loader for every source type, since it is described as the single default entry point for all ingestion needs.
    Show answer & explanation

    Correct answer: A — Start with the most managed layer available, such as a managed connector, and drop to less-managed layers only if requirements aren't met.

    • A. The recommended strategy is a layered approach: begin with the most managed option, such as a managed connector, and only move to standard, community, or custom options if that layer cannot meet the requirements.
    • B. Building a custom connector before checking whether a managed or standard connector already covers the source inverts the recommended order and adds unnecessary engineering effort.
    • C. Defaulting to a community connector regardless of whether a managed connector already supports the source skips the more automated, better-supported layer that should be tried first.
    • D. Auto Loader is a strong fit for cloud object storage ingestion specifically, not a universal default for every source type such as SaaS applications or databases.

    Subdomain 2.5: Use JDBC/ODBC or REST clients in notebooks

    9.A JDBC read of a narrow, 10-column table with 5 million rows from a notebook is unexpectedly slow even though the source database responds quickly to test queries. Reviewing the Spark job, the JDBC data source is issuing tens of thousands of small round trips, each returning only a handful of rows. Which option should the engineer adjust first?

    1. A.Increase the `fetchSize` option so each round trip to the source database returns a larger batch of rows, reducing the number of network round trips needed to pull the full result set.
    2. B.Increase `numPartitions` so more parallel JDBC connections open against the source, since adding connections reduces the number of rows returned per individual round trip automatically.
    3. C.Set `partitionColumn` to a column that is not indexed on the source database, which forces the database to return larger row batches per query instead of many small ones.
    4. D.Lower the cluster's `spark.sql.shuffle.partitions` value, since shuffle partition count directly controls how many rows a JDBC connector requests from the source in each round trip.
    Show answer & explanation

    Correct answer: A — Increase the `fetchSize` option so each round trip to the source database returns a larger batch of rows, reducing the number of network round trips needed to pull the full result set.

    • A. `fetchSize` directly controls how many rows the JDBC driver buffers per round trip, so raising it from a small default reduces the number of round trips needed and directly addresses the symptom described.
    • B. Adding partitions increases the number of parallel connections used to split a scan by row range; it does not change the row batch size returned per round trip within any one connection.
    • C. Choosing an unindexed `partitionColumn` affects how partition boundaries are computed and can hurt performance, but it has no direct effect on how many rows are returned per network round trip.
    • D. `spark.sql.shuffle.partitions` governs shuffle behavior for wide Spark operations like joins and aggregations after data is loaded; it has no effect on JDBC round-trip batching during the read itself.

    Subdomain 2.7: Ingest semi-structured and unstructured data

    10.A data engineer is building an Auto Loader stream that reads deeply nested JSON files. Downstream consumers require that a nested `user_info.dob` field always be materialized as a `DATE` column rather than whatever type Auto Loader would otherwise infer for it. Which mechanism lets the engineer force that specific nested field to a chosen type while still letting Auto Loader infer the rest of the schema automatically?

    1. A.A schema hint such as `"user_info.dob DATE"` passed as a reader option to the stream
    2. B.Casting the entire DataFrame after the stream is read, using a single `withColumn` call
    3. C.A Lakeflow Spark Declarative Pipelines expectation that rejects rows where the field is not a valid date
    4. D.A `COPY INTO` `FORCE` option applied directly to the destination Delta table definition
    Show answer & explanation

    Correct answer: A — A schema hint such as `"user_info.dob DATE"` passed as a reader option to the stream

    • A. Schema hints let you override the inferred type of a specific column path, including nested fields addressed with dot notation, while Auto Loader continues to infer the remaining schema automatically.
    • B. Post-read casting on the full DataFrame changes the value's type only after inference has already happened for every field, so it does not target a single nested field during schema inference itself.
    • C. A Lakeflow Spark Declarative Pipelines expectation validates or drops rows based on a condition at write time; it enforces a rule about the data rather than overriding the inferred column type during Auto Loader's schema inference step.
    • D. `COPY INTO` is a separate batch-loading SQL command with its own `FORCE` option for reloading files, and it does not apply to an Auto Loader streaming read or provide per-field type overrides.

    Domain 3: Data Transformation and Modeling

    Subdomain 3.2: Combine DataFrames with operations

    11.A data engineer has an `active_customers` DataFrame with 6 columns and an `archived_customers` DataFrame with 5 columns, and attempts `active_customers.union(archived_customers)`. What is the result?

    1. A.Spark raises an `AnalysisException` because `union` requires both DataFrames to have the same number of columns
    2. B.Spark combines the rows successfully and fills the missing sixth column in `archived_customers` with null values
    3. C.Spark drops the extra column from `active_customers` automatically and unions the remaining five matching columns
    4. D.Spark combines the rows successfully but leaves the sixth column entirely absent from the resulting DataFrame's schema
    Show answer & explanation

    Correct answer: A — Spark raises an `AnalysisException` because `union` requires both DataFrames to have the same number of columns

    • A. `union` requires both DataFrames to have the same number of columns with compatible types by position, so a 6-column DataFrame combined with a 5-column DataFrame raises an analysis error before any rows are combined.
    • B. `union` does not perform schema reconciliation or fill in missing columns with null; a column count mismatch causes an error rather than an automatic null-filled merge.
    • C. `union` does not silently drop columns to make schemas match; it strictly requires the same column count up front and fails when that is not the case.
    • D. The operation does not complete successfully with a mismatched column count, so there is no resulting DataFrame with a column silently removed from its schema.

    Subdomain 3.1: Implement data cleaning

    12.After cleaning a bronze `events` table with PySpark, an engineer needs to persist the cleaned DataFrame as a new managed Unity Catalog silver table named `main.sales.events_silver`, replacing any existing data on each run. Which call accomplishes this?

    1. A.Write with `mode("overwrite")` and `saveAsTable` to fully replace the managed silver table on every single run
    2. B.Write with `mode("append")` and `saveAsTable` to add new rows onto whatever data already exists in that same table
    3. C.Call `createOrReplaceTempView` to register the cleaned data, which only lasts for the current Spark session
    4. D.Write the DataFrame out as CSV files to a path instead of registering it as a queryable table in the catalog
    Show answer & explanation

    Correct answer: A — Write with `mode("overwrite")` and `saveAsTable` to fully replace the managed silver table on every single run

    • A. `saveAsTable` with `mode("overwrite")` writes the DataFrame as a managed table under the given three-level name and replaces all existing rows on each run, matching the requirement to fully refresh the silver table.
    • B. `append` mode adds the cleaned rows on top of whatever already exists in the table, which would duplicate previously written data instead of replacing it as the scenario requires.
    • C. A temporary view only exists for the current Spark session and is never persisted as a table in Unity Catalog, so the cleaned data would disappear once the session ends.
    • D. Writing CSV files to a local or object-store path creates plain files rather than a queryable Unity Catalog table, so it does not register `events_silver` as a table at all.

    Subdomain 3.4: Perform data deduplication operations and aggregate operations on DataFrames

    13.A data engineer builds `df.groupBy("region", "product_category").agg(sum("units_sold").alias("total_units"))` on a sales DataFrame. What does the resulting DataFrame contain?

    1. A.One row per distinct combination of `region` and `product_category`, each with the summed `units_sold` for that combination
    2. B.One row per original input row, each annotated with the running total of `units_sold` accumulated up to that row
    3. C.One row per distinct `region` value only, with `product_category` and `units_sold` dropped from the output entirely
    4. D.A single row containing the grand total of `units_sold` across the whole DataFrame, ignoring both grouping columns
    Show answer & explanation

    Correct answer: A — One row per distinct combination of `region` and `product_category`, each with the summed `units_sold` for that combination

    • A. Correct — grouping by both `region` and `product_category` produces one output row per unique combination of those two columns, each carrying the sum of `units_sold` for that specific group.
    • B. `groupBy().agg()` collapses rows within each group into a single summary row per group; it does not preserve one row per original input row or compute a running total across rows.
    • C. Both `region` and `product_category` were passed to `groupBy`, so the result is grouped by their combination, not by `region` alone, and the aggregated `units_sold` column is retained in the output.
    • D. Because two grouping columns were specified, the aggregation is computed separately for each combination of `region` and `product_category` rather than collapsing to one overall grand total.

    Subdomain 3.5: Understand the basic tuning parameters

    14.A job aggregates a 2 TB dataset while `spark.sql.shuffle.partitions` is left at its default of 200. The Spark UI shows each shuffle task processing several gigabytes of data, heavy spill to disk, and stage durations far longer than comparable jobs on smaller data. Which change should be applied and re-measured first?

    1. A.Increase `spark.sql.shuffle.partitions` so each shuffle partition holds a smaller amount of data and disk spill is reduced.
    2. B.Increase `spark.sql.autoBroadcastJoinThreshold` so the 2 TB dataset is broadcast to every executor instead of being shuffled.
    3. C.Increase `spark.default.parallelism`, since this setting overrides `spark.sql.shuffle.partitions` for DataFrame and SQL aggregations.
    4. D.Increase `spark.driver.memory` so the driver process can hold the intermediate shuffle output in memory instead of letting it spill.
    Show answer & explanation

    Correct answer: A — Increase `spark.sql.shuffle.partitions` so each shuffle partition holds a smaller amount of data and disk spill is reduced.

    • A. Raising the shuffle partition count spreads a fixed volume of data across more, smaller partitions, so each task handles less data and spills less to local disk. This directly targets the observed multi-gigabyte-per-task spill pattern.
    • B. A 2 TB dataset is far larger than any practical broadcast threshold, and forcing a broadcast of that size would exhaust executor memory rather than fix the spill. The broadcast threshold governs join planning, not aggregation shuffle sizing.
    • C. `spark.default.parallelism` applies to RDD-based operations and does not override the SQL-specific shuffle partition setting for DataFrame or SQL aggregations. Raising it would not change the aggregation's shuffle partition count.
    • D. Shuffle spill happens on the executors that hold the shuffle data, not on the driver, so increasing driver memory has no effect on executor-side spill during this aggregation.

    Subdomain 3.6: Understand the difference between, and how to build, Gold layer objects

    15.A junior data engineer proposes defining the gold-layer `customer_lifetime_value` object as a streaming table, reasoning that customers table updates frequently and a streaming table processes new records efficiently. The transformation logic recalculates lifetime value by aggregating a customer's full historical order history and applying corrections whenever late-arriving refund records are back-dated into earlier months. Why is a streaming table a poor fit for this specific gold-layer object?

    1. A.A streaming table applies exactly-once, append-only processing to each record, so it cannot handle logic that must reprocess aggregated historical values or update earlier results because of back-dated refund corrections.
    2. B.A streaming table cannot be created inside a Lakeflow Spark Declarative Pipeline at all, so any attempt to define `customer_lifetime_value` as a streaming table would immediately fail to compile or deploy within that pipeline.
    3. C.A streaming table always stores its data in the internal `__databricks_internal` catalog rather than a user-facing schema, making it impossible for BI tools to connect to or query the resulting lifetime value numbers directly.
    4. D.A streaming table can only be defined using Python decorators and does not support SQL syntax at all, so the team would be forced to rewrite the entire lifetime-value aggregation logic in PySpark instead of SQL.
    Show answer & explanation

    Correct answer: A — A streaming table applies exactly-once, append-only processing to each record, so it cannot handle logic that must reprocess aggregated historical values or update earlier results because of back-dated refund corrections.

    • A. This is correct. Streaming tables assume an append-only source and process each record exactly once, which does not accommodate aggregation logic that must revisit and correct historical results when back-dated refunds arrive.
    • B. This is incorrect. Streaming tables are a core dataset type supported natively within Lakeflow Spark Declarative Pipelines; the mismatch here is about processing semantics, not about whether the object type is permitted.
    • C. This is incorrect. Streaming tables are Unity Catalog managed tables registered in a normal catalog and schema, and BI tools can query them directly like any other table; internal backing storage details do not block that access.
    • D. This is incorrect. Streaming tables can be defined with either SQL (`CREATE OR REFRESH STREAMING TABLE`) or Python; SQL support is available and does not require rewriting the logic in PySpark.

    Subdomain 3.3: Manipulate columns, rows, and table structures

    16.An engineer writes `SELECT order_id, explode(items) AS item_id, explode(tags) AS tag FROM orders` to expand two different array columns from the same table in a single query. What is the most likely result of running this statement?

    1. A.The query fails, because Spark SQL only allows one `explode` (or other generator function) to appear in a single `SELECT` clause; the two arrays need to be exploded in separate steps.
    2. B.The query succeeds and produces the full cross product of `items` and `tags` for every single order row, similar to running a `CROSS JOIN LATERAL` between the two exploded array columns.
    3. C.The query succeeds and silently ignores the second `explode` call, returning only the rows produced by expanding the `items` array and leaving `tags` untouched.
    4. D.The query succeeds and interleaves the two arrays element by element, pairing the first item with the first tag, the second item with the second tag, and so on.
    Show answer & explanation

    Correct answer: A — The query fails, because Spark SQL only allows one `explode` (or other generator function) to appear in a single `SELECT` clause; the two arrays need to be exploded in separate steps.

    • A. Spark SQL restricts a `SELECT` clause to a single generator function such as `explode`; including two `explode` calls in the same clause raises an analysis error, and the two array expansions must instead be done through separate, chained `SELECT` statements or lateral views.
    • B. A single `explode` call does not perform a cross product between two different array columns; more importantly, the statement does not even run successfully because two generator functions cannot coexist in one `SELECT` clause.
    • C. Spark SQL does not silently drop one of two `explode` calls in the same clause; the presence of two generator functions in a single `SELECT` causes the query to fail validation rather than quietly ignoring one of them.
    • D. There is no positional zip behavior built into having two `explode` calls in one `SELECT` clause; the query does not reach execution at all because Spark SQL rejects multiple generator functions in the same clause.

    Subdomain 3.7: Apply data quality checks and validation rules

    17.A team writes Lakeflow pipeline code in Python using `import pyspark.pipelines as dp`. They need to silently discard any order record whose `order_total` is negative before it reaches the silver table, without failing the update. Which decorator call on the table function meets this requirement?

    1. A.`@dp.expect_or_drop("valid_total", "order_total >= 0")` removes rows that fail the condition before the write and lets the update finish normally.
    2. B.`@dp.expect("valid_total", "order_total >= 0")` records violations as a quality metric but still writes the negative-total rows into the target table.
    3. C.`@dp.expect_or_fail("valid_total", "order_total >= 0")` stops the pipeline update entirely the first time a negative `order_total` is encountered.
    4. D.`@dp.expect_or_drop("valid_total", "order_total < 0")` removes rows that fail the condition before the write, so only the negative-total rows would be kept in the target table.
    Show answer & explanation

    Correct answer: A — `@dp.expect_or_drop("valid_total", "order_total >= 0")` removes rows that fail the condition before the write and lets the update finish normally.

    • A. The `expect_or_drop` decorator drops records that fail its constraint before the data is written to the target, and the constraint `order_total >= 0` describes a valid record. Negative totals are therefore discarded while the update still completes.
    • B. The plain `expect` decorator only tracks violations for reporting; rows that fail the check are still written to the target table, so negative totals would remain in the silver table, which does not meet the requirement.
    • C. The `expect_or_fail` decorator makes invalid records prevent the update from succeeding, which is the opposite of the 'without failing the update' requirement in this scenario. It suits critical checks where any bad row should stop the run.
    • D. The right decorator, but the constraint is inverted: an expectation constraint states what a valid record looks like, so `order_total < 0` treats negative totals as valid and drops every non-negative order. The silver table would keep exactly the rows the team wants to discard.

    Domain 4: Working with Lakeflow Jobs

    Subdomain 4.1: Implement control flows using Lakeflow Jobs

    18.Which set of comparison operators can an If/else condition task in a Lakeflow Job evaluate when comparing a task value or job parameter against a literal?

    1. A.==, !=, >, >=, <, <=
    2. B.==, !=, LIKE, IN
    3. C.==, CONTAINS, STARTSWITH, ENDSWITH
    4. D.==, !=, AND, OR
    Show answer & explanation

    Correct answer: A — ==, !=, >, >=, <, <=

    • A. The If/else task type supports equality, inequality, and the four relational operators for comparing a dynamic value or job parameter against a literal. This is the complete operator set documented for condition tasks.
    • B. Pattern-matching operators like `LIKE` and set-membership operators like `IN` are not part of the If/else task's supported comparison operators. These are SQL-style operators rather than condition-task operators.
    • C. String-matching helpers such as `CONTAINS`, `STARTSWITH`, and `ENDSWITH` are not operators the If/else task evaluates. The task is limited to simple equality and relational comparisons, not substring matching.
    • D. `AND` and `OR` are logical operators for combining multiple conditions, not comparison operators for a single value check, and the If/else task does not expose them as selectable operators. Each If/else task evaluates one comparison at a time.

    Subdomain 4.4: Choose between time-based and data-driven triggers

    19.A table update trigger is starting job runs more frequently than the team's downstream systems can absorb, because the monitored table receives many small writes throughout the day. The team wants to cap the trigger so a new run cannot start until a fixed cooldown has elapsed after the previous run finished. Which setting should they configure?

    1. A.Set `wait_after_last_change_seconds` to delay each run until table writes stop for that duration, resetting on each write.
    2. B.Change the `condition` to `ALL_UPDATED` so a run only fires once every monitored table has changed at least once.
    3. C.Set `min_time_between_triggers_seconds` to enforce a minimum cooldown before the next run can start after a run completes.
    4. D.Remove the table update trigger and replace it with a file arrival trigger monitoring the table's underlying storage path.
    Show answer & explanation

    Correct answer: C — Set `min_time_between_triggers_seconds` to enforce a minimum cooldown before the next run can start after a run completes.

    • A. The `wait_after_last_change_seconds` setting debounces individual writes rather than enforcing a hard cooldown between completed runs, so it solves a different problem than limiting run frequency.
    • B. The `ALL_UPDATED` condition changes which tables must change to fire a trigger with multiple monitored tables, but it does not throttle how often runs occur for a single table.
    • C. The `min_time_between_triggers_seconds` setting caps run frequency by enforcing a minimum wait after the previous run completes before the next one can start, matching the cooldown requirement.
    • D. Monitoring the underlying storage path with a file arrival trigger would react to file-level writes instead of table state, and it does not offer the run-cooldown behavior being requested.

    Subdomain 4.4: Choose between time-based and data-driven triggers

    20.An upstream process periodically overwrites the same file name in a Unity Catalog volume with refreshed content instead of writing a new file. A data engineer configured a file arrival trigger on that volume and is confused that the downstream job never starts after these overwrites. What is the most likely explanation?

    1. A.File arrival triggers require the storage location to be an external location rather than a Unity Catalog volume, so the trigger never fires.
    2. B.File arrival triggers only fire when genuinely new files appear in the location, so overwriting an existing file name does not start a run.
    3. C.File arrival triggers only support paths containing wildcard patterns, so a fixed file name is silently ignored by the trigger.
    4. D.File arrival triggers check for changes only once every twenty-four hours, so the overwrite has simply not yet been noticed.
    Show answer & explanation

    Correct answer: B — File arrival triggers only fire when genuinely new files appear in the location, so overwriting an existing file name does not start a run.

    • A. File arrival triggers support both Unity Catalog volumes and external locations, so using a volume is not the reason the trigger fails to fire here.
    • B. File arrival triggers detect new files landing in the monitored location, and overwriting an existing file does not count as a new arrival, so no run is started.
    • C. File arrival triggers explicitly do not allow wildcard patterns in the monitored path, so this claim describes the opposite of how the feature actually works.
    • D. File arrival triggers make a best-effort check for new files roughly every minute rather than once a day, so check frequency is not the cause of the missing run.

    Subdomain 4.3: Implement job schedules using Lakeflow Jobs

    21.A finance team runs a nightly reconciliation job that must always execute at 2 AM in the America/New_York time zone regardless of whether any new data has arrived, because downstream analysts expect the report to be ready every morning at a fixed time. Which trigger type is the appropriate choice here, and why?

    1. A.A file arrival trigger, because the reconciliation job still depends on transaction data files that were written earlier in the day and must react to their arrival.
    2. B.A scheduled trigger using a Quartz cron expression with the time zone set to America/New_York, since the requirement is a fixed wall-clock time rather than a data event.
    3. C.A table update trigger on the transaction table, because that underlying table is technically updated at some point before 2 AM on most business nights.
    4. D.A continuous trigger, because it keeps a run active at all times and can therefore be expected to produce fresh output well before analysts arrive each morning.
    Show answer & explanation

    Correct answer: B — A scheduled trigger using a Quartz cron expression with the time zone set to America/New_York, since the requirement is a fixed wall-clock time rather than a data event.

    • A. Even though the job reads transaction files, the actual requirement is a guaranteed fixed start time regardless of data timing, and a file arrival trigger would instead run whenever files land, which could be well before or after 2 AM.
    • B. A cron-based scheduled trigger with the correct time zone directly guarantees the job starts at 2 AM local time every night, matching a requirement that is explicitly about a fixed wall-clock time rather than about reacting to any particular data event.
    • C. Relying on the transaction table's update timing is an approximation at best, since the table could update earlier or later than expected on a given night, which does not guarantee the fixed 2 AM start the analysts require.
    • D. A continuous trigger reruns the job back-to-back with no fixed schedule at all, so it cannot guarantee output is ready at any specific wall-clock time like 2 AM.

    Subdomain 4.2: Configure common tasks and their dependencies using Lakeflow Jobs

    22.A `disable_switch` task is marked disabled so it is skipped at runtime, but a downstream task depends on it with the `All succeeded` run-if condition. Based on how Lakeflow Jobs evaluates disabled upstream tasks, what happens to the downstream task?

    1. A.The downstream task does not run; it is marked disabled for that run, because a disabled parent does not satisfy `All succeeded`.
    2. B.The downstream task runs anyway, because Lakeflow Jobs treats a disabled upstream task as successful when it evaluates the `All succeeded` run-if condition.
    3. C.The downstream task stays pending indefinitely, because Lakeflow Jobs cannot evaluate any run-if condition against a disabled upstream task at all, ever.
    4. D.The downstream task runs only after an administrator manually approves the disabled task from inside the job run's UI page, using the approvals panel.
    Show answer & explanation

    Correct answer: A — The downstream task does not run; it is marked disabled for that run, because a disabled parent does not satisfy `All succeeded`.

    • A. This matches Databricks' documentation: a disabled parent task does not satisfy the `All succeeded` requirement, so the downstream task does not run, and Lakeflow Jobs also marks that downstream task disabled for the run rather than executing or failing it.
    • B. This confuses two distinct, separately documented result states. Databricks documents that upstream tasks in the `Excluded` result state are treated as successful for run-if evaluation, but a task that has been explicitly disabled is documented separately, and a disabled parent does not satisfy the succeeded requirement — so the downstream task does not run.
    • C. Lakeflow Jobs does evaluate run-if conditions against disabled upstream tasks automatically during the same run; it does not leave a downstream task pending indefinitely, so this option misstates how the disablement rule is applied.
    • D. There is no manual approval workflow for disabled tasks in Lakeflow Jobs. Run-if evaluation, and any resulting disablement of the downstream task, happens automatically without any operator action.

    Domain 5: Implementing CI/CD

    Subdomain 5.1: Manage your code development workflow within the Databricks workspace UI

    23.A developer in a Databricks Git folder has staged several changed files and clicks Commit & Push, but leaves the commit message field empty. What happens?

    1. A.Databricks blocks the commit because a commit message is required before changes can be pushed to the remote branch.
    2. B.Databricks pushes the changes using an auto-generated message that lists every modified file path in the folder.
    3. C.Databricks queues the commit locally and prompts for a message only the next time the folder is opened.
    4. D.Databricks pushes the changes with no commit message, leaving the message field blank in the Git provider's history.
    Show answer & explanation

    Correct answer: A — Databricks blocks the commit because a commit message is required before changes can be pushed to the remote branch.

    • A. The Git dialog requires a non-empty commit message before Commit & Push will proceed, so an empty message stops the operation.
    • B. There is no feature that auto-generates a commit message from the list of changed file paths; the developer must supply one.
    • C. Databricks does not defer message entry to a later session; the requirement is enforced at the moment Commit & Push is attempted.
    • D. A push with a blank message is not permitted, so the change is not sent to the remote repository until a message is entered.

    Subdomain 5.3: Deploy Declarative Automation Bundles

    24.A data engineering team keeps a Lakeflow Job and a Lakeflow Spark Declarative Pipeline defined as source in a repository, and wants to promote the exact same resource definitions from a dev workspace to a prod workspace without hand-editing settings in the UI at each stage. Which capability of Declarative Automation Bundles addresses this directly?

    1. A.A `databricks.yml` file declares the job and pipeline as code, and named targets override settings like the workspace host so the same definitions deploy consistently across environments.
    2. B.The Databricks workspace UI automatically detects every resource change made in dev and replicates it into prod once an administrator approves the diff through the audit log console.
    3. C.Lakeflow Jobs and Spark Declarative Pipelines synchronize their configuration across workspaces natively whenever the resources share the same catalog and schema names in both environments.
    4. D.A cluster policy attached to the job restricts which workspace the job can run in, which indirectly forces the same compute configuration to apply consistently across dev and prod.
    Show answer & explanation

    Correct answer: A — A `databricks.yml` file declares the job and pipeline as code, and named targets override settings like the workspace host so the same definitions deploy consistently across environments.

    • A. This describes the core mechanism of a bundle: resources are declared once in `databricks.yml`, and targets override host, variables, and other settings per environment so the same source deploys consistently across dev, test, and prod.
    • B. There is no UI feature that auto-detects and replicates resource changes between workspaces through an audit-log approval flow; promotion across environments is driven by deploying bundle configuration, not by UI diffing.
    • C. Jobs and pipelines do not natively synchronize configuration across workspaces based on shared catalog or schema names; each workspace's resources are independent unless a bundle deploys the same definitions to both.
    • D. A cluster policy constrains compute settings for a single job run and has no mechanism for propagating or synchronizing configuration between separate workspaces.

    Subdomain 5.2: Understand environment-specific configuration using Automation Bundle

    25.A bundle variable has a target-level override defined inside `databricks.yml`, and a `--var` flag for the same variable is also passed on the `bundle deploy` command line. Which value does the Databricks CLI use?

    1. A.The command-line `--var` value wins, because CLI flags take precedence over target overrides, environment variables, and top-level defaults.
    2. B.The target-level override wins, because values already defined inside `databricks.yml` always take precedence over any command-line input.
    3. C.The CLI raises a validation error and refuses to deploy, because a variable cannot be set from two different sources at once.
    4. D.Both values are merged into a single ordered list, and the job receives the target override first followed by the command-line value as a fallback.
    Show answer & explanation

    Correct answer: A — The command-line `--var` value wins, because CLI flags take precedence over target overrides, environment variables, and top-level defaults.

    • A. The Databricks CLI resolves variable values in a fixed priority order, and a command-line `--var` flag sits at the top of that order, overriding target-level overrides, `BUNDLE_VAR_` environment variables, and top-level defaults.
    • B. Target-level overrides are lower priority than a command-line `--var` flag; they only take effect when no higher-priority source, such as a CLI flag or environment variable, supplies a value for that variable.
    • C. Having multiple potential sources for the same variable is expected and handled through a defined precedence order rather than treated as a conflict, so the CLI does not raise a validation error in this situation.
    • D. Bundle variables resolve to a single scalar or complex value per deployment; the CLI does not merge values from multiple sources into a list or apply one as a runtime fallback for the other.

    Subdomain 5.4: Understand the Databricks CLI to validate, deploy, and manage Declarative Automation Bundles

    26.A platform team wants pull-request pipelines in GitHub Actions to fail fast if a contributor's databricks.yml has a typo or an invalid resource reference, before any workspace credentials are even needed. Which CLI step best fits early in that pipeline?

    1. A.Add a step that runs `databricks bundle validate`, since it only parses and checks the local configuration and does not require deploying or authenticating against a live workspace target
    2. B.Add a step that runs `databricks bundle deploy -t dev --auto-approve`, since deploying to a scratch dev target is the only way the CLI can confirm the configuration parses correctly
    3. C.Add a step that runs `databricks bundle run --validate-only`, since this flag exists specifically to check every resource type in the bundle for configuration errors before any deploy happens at all
    4. D.Add a step that runs `databricks bundle destroy -t dev --auto-approve`, since tearing down and recreating the dev target on every pull request is described as the standard way to catch config drift
    Show answer & explanation

    Correct answer: A — Add a step that runs `databricks bundle validate`, since it only parses and checks the local configuration and does not require deploying or authenticating against a live workspace target

    • A. This is correct: `databricks bundle validate` checks configuration files for errors and prints a resource summary using only local parsing, so it can catch typos and bad references in CI before any deployment or workspace call is needed.
    • B. Deploying to a dev target requires valid workspace credentials and actually creates or updates resources, which is unnecessary overhead and risk just to catch a configuration typo early in the pipeline.
    • C. `--validate-only` is a flag scoped to `databricks bundle run` for pipeline resources specifically, not a general bundle-wide configuration check, and `bundle run` still requires the bundle to already be deployed.
    • D. `databricks bundle destroy` deletes deployed resources and is unrelated to catching configuration typos; using it as a pull-request check would also be destructive and require existing deployed state.

    Domain 6: Troubleshooting, Monitoring, and Optimization

    Subdomain 6.2: Use the Lakeflow Jobs UI to monitor pipeline health

    27.A pipeline job that normally completes in about 12 minutes has been taking over 40 minutes for the last three runs, though it still finishes with a Succeeded status each time. Using only the Lakeflow Jobs UI, how can the engineer confirm this is an unusual trend rather than normal variance?

    1. A.Open the job's run history and compare the total duration bars across recent runs against the historical baseline shown in the Matrix or Runs list view.
    2. B.Check the Spark UI stage detail page for the most recent run, since only stage-level shuffle metrics reveal whether a run duration is abnormal.
    3. C.Query the job's cluster event log directly, because the Jobs UI only reports whether a run succeeded or failed and never reports duration.
    4. D.Rerun the job manually from the Repair run option, since a successful repair run duration is the only reliable duration baseline available.
    Show answer & explanation

    Correct answer: A — Open the job's run history and compare the total duration bars across recent runs against the historical baseline shown in the Matrix or Runs list view.

    • A. The run history views display each run's total duration alongside prior runs, so lining up recent bars against the historical pattern is the direct way to confirm a 12-minute job is now consistently taking 40 minutes. This does not require leaving the Jobs UI at all.
    • B. Stage-level shuffle metrics can help explain why a run is slow, but they are not needed just to confirm that a duration trend exists, and reading only the most recent run would miss the comparison against the historical baseline entirely.
    • C. The Jobs UI does report run duration for every run, so this understates what the UI provides and sends the engineer to a source that does not track run-over-run trends the way the run history view does.
    • D. Repair run reruns only the tasks that failed in a specific past run, and since every recent run already succeeded there is nothing to repair; it also would not establish a historical duration baseline.

    Subdomain 6.3: Identify common performance bottlenecks

    28.A `groupBy` aggregation is heavily skewed because a single customer ID accounts for a large share of all rows, causing one task to process far more data than the others in the Spark UI's stage metrics. AQE's skew join optimization does not apply here because the bottleneck occurs in an aggregation rather than a join. Which technique would most directly reduce the skew for this aggregation?

    1. A.Salting the skewed key with a random suffix before grouping, then re-aggregating to spread its rows across partitions.
    2. B.Reducing `spark.sql.shuffle.partitions` to a smaller value, consolidating the aggregation into fewer, larger partitions per task.
    3. C.Converting the aggregation to a broadcast join against a lookup table, eliminating the shuffle step regardless of key distribution.
    4. D.Repartitioning the DataFrame by a monotonically increasing surrogate column, ignoring the original grouping key altogether.
    Show answer & explanation

    Correct answer: A — Salting the skewed key with a random suffix before grouping, then re-aggregating to spread its rows across partitions.

    • A. This is correct. Salting appends a random suffix to the overrepresented key, splitting its rows across several synthetic sub-keys during the first aggregation pass, then a second pass aggregates the partial results back together, distributing the heavy key's workload across many tasks.
    • B. Reducing the shuffle partition count consolidates data into fewer partitions, which would make the imbalance worse, not better, since the already-heavy key's partition would absorb even more of the remaining data.
    • C. An aggregation is not a join between two tables, so there is no join side to broadcast; this option does not apply to reducing skew within a single `groupBy` on one DataFrame.
    • D. Repartitioning by an unrelated surrogate column changes how rows are physically distributed for storage but does not affect how Spark shuffles data by the grouping key during the aggregation itself, so the skew on that key remains.

    Subdomain 6.4: Understand the features of Liquid Clustering and predictive optimization

    29.Which three maintenance operations does predictive optimization automatically manage for eligible Unity Catalog managed tables?

    1. A.`OPTIMIZE`, `ZORDER`, and `VACUUM`, since ZORDER is required alongside file compaction for predictive optimization to run
    2. B.`OPTIMIZE`, `VACUUM`, and `ANALYZE`, covering file compaction, stale file cleanup, and statistics collection respectively
    3. C.`ANALYZE`, `REORG TABLE`, and `REPAIR TABLE`, since these rebuild metadata and table structure for query planning
    4. D.`OPTIMIZE`, `VACUUM`, and `REORG TABLE`, combining compaction, cleanup, and type-widening rewrites automatically
    Show answer & explanation

    Correct answer: B — `OPTIMIZE`, `VACUUM`, and `ANALYZE`, covering file compaction, stale file cleanup, and statistics collection respectively

    • A. `ZORDER` is a manual clustering technique that is actually incompatible with liquid clustering; it is not one of the three operations predictive optimization automates.
    • B. Predictive optimization automatically runs `OPTIMIZE` for file compaction and incremental clustering, `VACUUM` for removing unreferenced files, and `ANALYZE` for refreshing table statistics.
    • C. `REORG TABLE` and `REPAIR TABLE` are manually invoked commands for specific maintenance tasks; neither is part of the automated set predictive optimization manages.
    • D. `REORG TABLE` is a manually run command used for tasks like type widening, not one of the operations predictive optimization schedules automatically.

    Subdomain 6.1: Identify trends in job performance using the Lakeflow Jobs run history view

    30.A serverless Lakeflow task issues 150 SQL queries during a single run, and an engineer notices that several later queries show no performance insight badge even though they appear slow in the query history. What explains this?

    1. A.Databricks aggregates query-level performance metrics for only the first 100 queries in a run, so later queries are excluded.
    2. B.Performance insight badges only ever appear for queries that read from Unity Catalog managed tables rather than external tables.
    3. C.The job's expected completion time threshold was already exceeded, which suppresses insight badges for remaining queries.
    4. D.The task was executed on a job cluster instead of serverless compute, which disables performance insight badges entirely.
    Show answer & explanation

    Correct answer: A — Databricks aggregates query-level performance metrics for only the first 100 queries in a run, so later queries are excluded.

    • A. This is correct because Databricks aggregates query-level performance metrics across only the first 100 queries within a run, so a task issuing 150 queries will have its later queries fall outside that aggregation window and therefore lack insight badges.
    • B. This is incorrect because performance insight badges are not gated on whether a table is Unity Catalog managed versus external; the limiting factor described for this feature is the count of queries per run, not the storage type queried.
    • C. This is incorrect because the expected completion time is a separate duration-threshold warning on the overall run and has no effect on whether individual queries receive performance insight badges.
    • D. This is incorrect because performance insight badges, the Timeline view, and per-query aggregation are serverless-specific capabilities in the first place; the scenario already states the task ran on serverless compute, so cluster type is not the explanation.

    Subdomain 6.5: Diagnose cluster startup failures, library conflicts, and out-of-memory issues

    31.When a Spark job on a Databricks cluster fails with an out-of-memory error, which combination of resources gives the most direct evidence of whether the failure originated on the driver or on an executor?

    1. A.The driver logs for stack traces mentioning the failing process, combined with the Spark UI Executors tab for per-node memory and garbage-collection metrics.
    2. B.The Databricks billing usage dashboard, which reports which specific node incurred the highest compute cost during the run and is therefore the likely failure point.
    3. C.The workspace audit log, which records every notebook command but does not capture memory allocation on either the driver or the executors.
    4. D.The cluster's autoscaling history graph, which shows only how many executors were attached over time and not their individual memory usage.
    Show answer & explanation

    Correct answer: A — The driver logs for stack traces mentioning the failing process, combined with the Spark UI Executors tab for per-node memory and garbage-collection metrics.

    • A. Driver logs surface the actual stack trace and error message that identify which process ran out of memory, while the Spark UI's Executors tab shows per-node memory usage and garbage-collection time that reveal whether individual executors were under memory pressure. Together these two sources give the most direct, process-level evidence needed to localize an out-of-memory failure.
    • B. Compute cost reflects how much a node ran and what instance type it used, not how much memory it consumed or whether it failed, so a billing dashboard cannot distinguish a driver failure from an executor failure. Cost data is unrelated to memory diagnostics.
    • C. The audit log is built for tracking user actions and commands for governance purposes and does not record memory allocation or process-level errors, so it cannot help localize an out-of-memory failure to the driver or an executor.
    • D. An autoscaling history graph shows how many executors were attached at a given time, which is useful for capacity planning but does not report memory usage on any individual node, so it cannot show which process exhausted its memory.

    Domain 7: Governance and Security

    Subdomain 7.1: Differentiate between managed and external tables in Unity Catalog

    32.A data engineer runs `CREATE TABLE analytics.sales.orders (...)` and omits any `LOCATION` clause. Where does Unity Catalog store the resulting data files?

    1. A.Under the managed storage location resolved from the containing schema, catalog, or metastore, whichever level has a managed location configured, since no path was given.
    2. B.In a temporary DBFS root path that must be manually migrated to permanent storage before the table can be queried by any other user or job in the workspace.
    3. C.In the workspace's default external location, which every Unity Catalog metastore provisions automatically for tables that omit an explicit `LOCATION` clause at creation time.
    4. D.In the same storage path as the most recently created external table in that schema, since Unity Catalog reuses the last referenced path by default.
    Show answer & explanation

    Correct answer: A — Under the managed storage location resolved from the containing schema, catalog, or metastore, whichever level has a managed location configured, since no path was given.

    • A. Correct. Omitting `LOCATION` creates a managed table, and Unity Catalog resolves its storage path from the nearest configured managed location on the schema, catalog, or metastore.
    • B. Incorrect. Managed tables are not placed in a temporary DBFS root requiring manual migration; Unity Catalog resolves a permanent managed location automatically.
    • C. Incorrect. Omitting `LOCATION` creates a managed table, not one placed in a default external location, and there is no such automatic external-location provisioning behavior.
    • D. Incorrect. Unity Catalog does not reuse the storage path of another table; each managed table resolves its own path from the schema, catalog, or metastore managed location.

    Subdomain 7.4: Understand Unity Catalog ABAC policies

    33.A column mask policy redacts customer email addresses for most groups. The compliance team must still see the full, unmasked email address for investigations. How should this exception be expressed in the `CREATE POLICY` statement?

    1. A.Add an `EXCEPT compliance_team` clause to the policy's principal list, so the masking function is skipped whenever a member of that group runs the query.
    2. B.Create a second column mask policy that masks the column for every group, then rely on the newer policy to silently override the first one.
    3. C.Grant the compliance team the `MODIFY` privilege on the table, since only write privileges determine whether column mask policies apply to a group's queries.
    4. D.Add a `WHEN has_tag_value('sensitivity','high')` clause naming the compliance team, since `WHEN` clauses in `CREATE POLICY` select principals rather than tables.
    Show answer & explanation

    Correct answer: A — Add an `EXCEPT compliance_team` clause to the policy's principal list, so the masking function is skipped whenever a member of that group runs the query.

    • A. This is correct: the `EXCEPT` clause in a policy's principal list exempts named principals from the masking or filtering behavior, so the compliance team sees the unmodified column value while everyone else still sees the masked one.
    • B. This is incorrect. Stacking a second masking policy for every group does not create a targeted exception for one team, and relying on implicit override behavior between overlapping policies is not how exceptions are expressed.
    • C. This is incorrect. Write privileges like `MODIFY` govern the ability to change data, not whether a read-time column mask policy is applied; masking exceptions are controlled through the policy's principal clause, not table privileges.
    • D. This is incorrect. A `WHEN` clause in `CREATE POLICY` scopes which tagged tables the policy applies to, not which principals are exempt; principal exceptions belong in the `TO`/`EXCEPT` clause instead.

    Subdomain 7.3: Understand column-level masking and row-level security

    34.A compliance team asks whether a data engineer can run `SELECT * FROM finance.transactions VERSION AS OF 5` on a table that has an active row filter and column mask to inspect a prior data state before the policies existed. What is the expected outcome?

    1. A.Time travel is unsupported on tables with row filters or column masks attached, so this `VERSION AS OF` query is expected to fail outright
    2. B.The query succeeds and returns the version-5 data exactly as it looked before any row filter or column mask was ever attached to it
    3. C.The query succeeds, but Unity Catalog silently ignores the `VERSION AS OF` clause and returns the table's current state instead of it
    4. D.The query succeeds only for members of the account's top-level admin group, regardless of what the row filter or mask logic actually specifies
    Show answer & explanation

    Correct answer: A — Time travel is unsupported on tables with row filters or column masks attached, so this `VERSION AS OF` query is expected to fail outright

    • A. Unity Catalog documents time travel as one of the operations unsupported on tables with row filters or column masks attached, so a `VERSION AS OF` query against such a table is expected to be rejected rather than succeed.
    • B. Because time travel itself is unsupported once these policies are present, the engineer cannot retrieve the historical version at all, regardless of whether the older data predates the policy's creation.
    • C. The restriction causes the query to fail rather than quietly substitute the current table state for the requested historical version, so no result set is silently returned.
    • D. The unsupported-operation restriction is not bypassed by admin group membership; row filter and column mask logic controls row and column visibility, but the time-travel limitation applies at the table level regardless of who is querying.

    Subdomain 7.2: Configure access controls using the UI and SQL

    35.An engineer runs `GRANT USE CATALOG, USE SCHEMA, SELECT ON CATALOG analytics TO bi_team` before any schemas exist in the catalog. Months later, several new schemas and tables are created inside `analytics`. Does `bi_team` need any additional grants to query the new tables?

    1. A.No, because privileges granted on a catalog also apply to schemas and tables created in it later, not only to objects that existed at grant time.
    2. B.Yes, the group needs a fresh grant on each new schema, because catalog-level grants only apply to objects that already existed when the statement ran.
    3. C.Yes, but only `USE SCHEMA` needs to be re-granted on each new schema, since `SELECT` inherited from the catalog covers tables while `USE` privileges never inherit downward.
    4. D.No, but only because Unity Catalog automatically re-runs every catalog-level grant statement nightly against newly created schemas and tables.
    Show answer & explanation

    Correct answer: A — No, because privileges granted on a catalog also apply to schemas and tables created in it later, not only to objects that existed at grant time.

    • A. Correct. Unity Catalog documents that when you grant a privilege on a parent object, it applies to all current and future child objects. The statement already covers the three privileges needed to read a table (USE CATALOG, USE SCHEMA and SELECT), so the new schemas and tables are readable without any further grant.
    • B. Incorrect. Catalog-level grants are not limited to objects that existed at grant time; they apply to all current and future schemas and tables in the catalog, so a per-schema grant is redundant.
    • C. Incorrect. USE SCHEMA was granted at the catalog level in the same statement, and a USE SCHEMA grant on a catalog automatically applies to all current and future schemas in it. Container privileges do inherit downward, so nothing needs to be re-granted.
    • D. Incorrect. There is no nightly re-application job; inheritance is a property of how the original grant is evaluated against child objects, not a scheduled re-grant process.

    Want the full experience?

    These are just samples. Practice the full Databricks Certified Data Engineer Associate question bank in quiz mode — free, no signup, with domain practice and exam simulation.