Google Cloud Professional Data Engineer Practice Exam
Google Cloud Certified - Professional Data Engineer
The Google Cloud Professional Data Engineer exam validates the ability to design, build, secure and operate data processing systems on Google Cloud, and to make data usable for analysis and AI. Its five sections are designing data processing systems at about 22 percent, ingesting and processing the data at about 25 percent, storing the data at about 20 percent, preparing and using data for analysis at about 15 percent, and maintaining and automating data workloads at about 18 percent. The exam has 40 to 50 questions in two hours. This practice exam mirrors that scope with multiple choice and multiple select scenarios.
Question bank updated : questions, answers, explanations and chapters.
Certification Overview
- Exam name: Professional Data Engineer
- Vendor: Google Cloud
- Duration: 120 minutes
- Total questions: about 50
- Our practice exam pass mark: 70%
Who Should Take This Exam?
Data Engineer, Cloud Data Engineer, Analytics Engineer, Big Data Engineer, ETL Developer, Data Architect, BigQuery Developer, Data Platform Engineer, Machine Learning Engineer
Prerequisites
No formal prerequisite. Google recommends 3 or more years of industry experience, including 1 or more years designing and managing solutions using Google Cloud.
Topics Covered
- Designing data processing systems
- Ingesting and processing the data
- Storing the data
- Preparing and using data for analysis
- Maintaining and automating data workloads
Question Types
- Multiple Choice (Single Answer)
- Multiple Choice (Multiple Answers)
Professional Data Engineer Practice Questions
Our question bank contains 733+ practice questions for this certification. Sample questions from each exam chapter. Expand a question to see the answer choices. With a subscription, you get unlimited practice exams with randomised questions from our full question bank.
Designing data processing systems
Your BigQuery customer table holds phone numbers. Marketing analysts must query the column but see only the last four digits, while the support group must see full values. Security wants the rule enforced on the column itself, so that new views and queries inherit it without extra copies of the data. What should you do?
- A. Add a row-level access policy on the table that limits which rows the marketing analysts can read
- B. Apply a policy tag with a last-four masking rule to the column; grant marketing Masked Reader and support Fine-Grained Reader Correct answer
- C. Run a Cloud DLP de-identification job that writes a masked copy of the table for the marketing group
- D. Create an authorized view that returns the last four characters and give marketing access to the view only
Option B is correct because a policy tag with a data masking rule on the column enforces the last-four masking at the column itself, so new views and queries inherit it, while Fine-Grained Reader lets support see full values. Option A restricts rows, not column values. Option C creates a separate masked copy of the data, and option D protects only what the view returns rather than the column.
You must find which columns across your BigQuery datasets contain credit card numbers before you design access controls. Which should you use?
- A. Cloud Audit Logs Data Access logs
- B. Cloud DLP inspection with the CREDIT_CARD_NUMBER infoType Correct answer
- C. BigQuery INFORMATION_SCHEMA column metadata views
- D. Security Command Center vulnerability scanning
Option B is correct because Cloud DLP inspection scans the actual column contents and recognises card numbers with the CREDIT_CARD_NUMBER infoType. Audit logs (A) record access, not content, INFORMATION_SCHEMA (C) shows only column names and types, and Security Command Center vulnerability scanning (D) does not classify data.
You are designing a shared BigQuery events table for 30 tenants. When a tenant leaves, its data must become permanently unreadable within hours, without rewriting the table or splitting it into per-tenant tables, and active tenants must keep querying with SQL. What should you do?
- A. Enforce a row-level access policy per tenant and remove the tenant's policy and its grantees when it leaves
- B. Encrypt tenant columns with AEAD functions using a per-tenant keyset wrapped by Cloud KMS; destroy that key on exit Correct answer
- C. Protect the table with one CMEK key in Cloud KMS and disable that key version when a tenant leaves
- D. Place each tenant in its own dataset with a dedicated CMEK key and disable that key when the tenant leaves
Option B is correct because AEAD encryption with a per-tenant keyset wrapped by Cloud KMS lets active tenants keep using SQL while destroying one tenant's key makes only that tenant's data unreadable, with no rewrite or table split. Option A only removes access and the data stays readable to administrators. Option C uses one key for the whole table, so disabling it would affect every tenant. Option D splits the data into per-tenant datasets, which the requirements rule out.
A Dataflow streaming job reads from one Pub/Sub subscription and writes to one BigQuery dataset, but it runs as the project's default Compute Engine service account, which holds the Editor role. Your security team asks for least privilege. What should you do?
- A. Keep the default service account but replace Editor with Dataflow Admin at the project level
- B. Grant the Dataflow service agent Pub/Sub Subscriber and BigQuery Data Editor on the two resources
- C. Have each engineer launch the job with their own user credentials so the workers inherit that access
- D. Use a dedicated worker service account with Dataflow Worker plus subscription-level and dataset-level data roles Correct answer
Option D is correct because a dedicated worker service account with the Dataflow Worker role plus subscription-level and dataset-level data roles gives the job only the access it needs. Option A keeps the shared default account and still grants broad project-level rights. Option B grants roles to the Dataflow service agent, which does not run the pipeline code on the workers. Option C ties production jobs to individual users and does not make workers inherit their credentials.
Ingesting and processing the data
Your analysts have no programming experience but must design batch pipelines by connecting source, transformation and sink plugins on a visual canvas. Which Google Cloud service should you provide?
- A. Dataflow with the Apache Beam Java SDK
- B. Cloud Composer
- C. Dataproc with Spark notebooks
- D. Cloud Data Fusion Correct answer
Option D is correct because Cloud Data Fusion provides a visual, code-free canvas where you connect source, transformation and sink plugins into batch pipelines. Dataflow with the Beam Java SDK and Dataproc with Spark notebooks both require programming, and Cloud Composer orchestrates workflows with Python DAGs rather than offering a drag-and-drop pipeline designer.
Raw sales tables land in BigQuery every 15 minutes. Your team knows SQL but not Apache Beam, and needs version-controlled transformations that run in dependency order with built-in data checks, without operating any orchestration infrastructure. What should you use?
- A. Cloud Data Fusion pipelines that use the BigQuery Execute plugin
- B. Dataform SQLX workflows with assertions, stored in a Git repository Correct answer
- C. A Dataflow pipeline that reads the BigQuery tables through the Beam SDK
- D. Cloud Composer with BigQuery operator tasks in Python DAGs
Option B is correct because Dataform lets a SQL-skilled team define SQLX transformations in a Git repository, resolves dependency order automatically, supports assertions for data checks, and is fully managed with no orchestration infrastructure to run. Data Fusion and Dataflow are not SQL-first, version-controlled transformation tools, and Cloud Composer requires operating an Airflow environment and writing Python DAGs.
Your streaming Dataflow pipeline aggregates events into five-minute event-time fixed windows with the default trigger. What causes a window's result to be emitted for the first time?
- A. The arrival of the first element whose timestamp falls in the next window
- B. The Pub/Sub subscription backlog dropping to zero
- C. The worker's system clock reaching the end of the window
- D. The watermark passing the end of the window Correct answer
Option D is correct because with the default trigger in event-time windowing, Dataflow emits a window's result when the watermark passes the end of the window. The watermark is the system's estimate of event-time completeness, not the arrival of a later element, the worker clock or Pub/Sub backlog reaching zero, so options A, B and C describe conditions that do not drive the default trigger.
A nightly Spark ETL job on Dataproc is CPU-bound and tolerates task retries. Intermediate and final data are written to Cloud Storage, and you want to cut compute cost without putting the job's results at risk. What should you do?
- A. Run the master node on a Spot VM to lower its hourly cost
- B. Keep the primary workers on standard VMs and add Spot VMs as secondary workers Correct answer
- C. Use a single-node cluster with the largest available machine type for the master
- D. Replace all primary workers with Spot VMs so every worker is discounted
Option B is correct because secondary workers on Spot VMs add cheap, preemptible capacity for a retry-tolerant, CPU-bound job, while the standard primary workers keep HDFS and the job's core capacity stable. Putting the master on Spot (A) or replacing all primary workers with Spot (D) risks losing the cluster or its core capacity when VMs are preempted, and a single-node cluster (C) removes parallelism and does not cut cost for this job.
Storing the data
Every night, your data team computes a feature table for 300 million customers in BigQuery. The checkout service must look up one customer's features by key in under 10 ms at about 50,000 requests per second. Values only need to be as fresh as the nightly job, lookups never join or update, and cost should stay low. Which design should you choose?
- A. Cluster the BigQuery table on customer ID and query it directly from the service
- B. Export the table to Bigtable after each nightly run and serve lookups from it Correct answer
- C. Cache the table in a BI Engine reservation and query it by customer ID from the service
- D. Load the table into Spanner after each nightly run and serve lookups from it
Option B is correct because Bigtable is built for single-key lookups at tens of thousands of requests per second with single-digit-millisecond latency, and a nightly export fits values that only need nightly freshness at low cost. Option A still runs a BigQuery query per lookup, so latency and cost are far too high. Option C cannot hold or serve a table of this size at that rate, and option D would work but pays for Spanner's transactional capabilities that this read-only workload does not need.
A Spanner database stores Orders and OrderItems. Nearly every read fetches an order together with all of its items, and items are also updated and queried individually by SKU. The team wants the combined reads to touch as few splits as possible. How should you define the schema?
- A. Define a foreign key from OrderItems to Orders with a secondary index
- B. Give both tables keys from a shared sequence so that related rows get nearby values
- C. Interleave OrderItems in Orders, with the order's key as its primary key prefix Correct answer
- D. Store each order's items in a JSON column of the Orders table
Option C is correct because interleaving stores each order's items physically next to the parent row, so reading an order with all its items touches as few splits as possible while items remain individually addressable by their key. A foreign key with an index (A) does not co-locate rows, and keys from a shared sequence (B) do not guarantee adjacency and cause hotspots. A JSON column (D) makes updating and querying single items by SKU awkward.
A QA team needs a writable copy of a 20 TB production BigQuery table to test schema changes. The copy must be available within seconds and add as little storage cost as possible. What should you create?
- A. A full copy made with a BigQuery copy job
- B. A table snapshot of the production table
- C. A table clone of the production table Correct answer
- D. A new table made with CREATE TABLE AS SELECT
Option C is correct because a table clone is writable, is created in seconds as a metadata operation, and is billed only for data that differs from the base table. A snapshot (B) is read-only, so schema changes cannot be tested on it. A copy job (A) and CREATE TABLE AS SELECT (D) both duplicate all 20 TB and take longer.
Which TWO statements describe a data lake built on Cloud Storage, as opposed to a data warehouse in BigQuery? (Choose two)
- A. Schema is applied when the data is read, not when it is written Correct answer
- B. Every record is validated against a table schema when it is written
- C. Spark and Trino can read the same files directly Correct answer
- D. Single-row lookups return in single-digit milliseconds
- E. Data must be modeled into a star schema before it is loaded
Options A and C are correct because a data lake on Cloud Storage keeps files in open formats, applies schema on read, and lets several engines such as Spark and Trino read the same files directly. Option B describes schema on write, which belongs to a warehouse. Option D is wrong because object storage is not built for single-digit millisecond row lookups. Option E is wrong because a lake does not require modeling before loading.
Preparing and using data for analysis
Your Looker instance builds a persistent derived table from BigQuery order data, and dashboards on it must refresh as soon as the nightly load completes. The load finishes at a different time each night, between 01:00 and 04:00, and records its completion timestamp in an etl_log table. The PDT currently uses persist_for set to 24 hours, so dashboards show stale or partly loaded data. What should you do?
- A. Schedule the dashboard for delivery at 04:30 each night so that the query cache is warmed after the load
- B. Use a datagroup with a sql_trigger on MAX(completed_at) from etl_log as the PDT's datagroup_trigger Correct answer
- C. Use a datagroup with a sql_trigger of SELECT CURRENT_DATE() as the PDT's datagroup_trigger
- D. Set persist_for on the PDT to 4 hours
Option B is correct because a datagroup whose sql_trigger returns MAX(completed_at) from etl_log changes value only when the load actually finishes, so the PDT rebuilds right then, whatever time between 01:00 and 04:00 that is. Option C rebuilds at midnight, possibly before the load, and options A and D rely on fixed times or caches that cannot track a variable finish time.
Regional sales managers open a Looker Studio report on a BigQuery table that has one row access policy per region group. Every manager sees all regions' rows, although each sees only their own region when querying the table directly in BigQuery. What should you change?
- A. Switch the data source to viewer's credentials and give the managers BigQuery access to the dataset Correct answer
- B. Change the data source to a custom query that adds a WHERE clause comparing region to SESSION_USER()
- C. Build one authorized view per region and point a separate copy of the report at each view
- D. Add a region filter control to each report page and set its default to the manager's own region
Option A is correct because a Looker Studio data source using owner's credentials queries BigQuery as the owner, so the row access policies evaluate for the owner and every manager sees the same rows. Viewer's credentials run each query as the viewer, so the policies filter per manager. Options B, C and D either bypass or duplicate the existing policies, or only filter in the report rather than enforcing access.
A dashboard repeats the same daily-revenue-by-region aggregation over a 20 TB fact table that receives streaming inserts all day. Users accept data up to 30 minutes old, and the team does not want to run scheduled jobs for this. Query time and bytes processed stay high even with a materialized view created with default settings. What should you do?
- A. Replace the materialized view with a logical view over the same aggregation query
- B. Write the aggregation to a summary table with a scheduled query that runs every 30 minutes
- C. Partition the fact table by order date and add a partition filter to the dashboard query
- D. Set max_staleness to 30 minutes on the materialized view Correct answer
Option D is correct because a materialized view with max_staleness lets BigQuery serve the stored results plus no recent-delta processing when the data is within the tolerated age, which cuts query time and bytes on a heavily streamed 20 TB table with no scheduled job. A logical view saves nothing, a scheduled query is the job the team wants to avoid, and partitioning alone does not remove the repeated aggregation.
Dashboards query 400 TB of Parquet files in Cloud Storage, laid out as gs://lake/events/dt=2026-01-31/country=DE/, through a BigLake table that was defined without hive partitioning options. Charts always filter on dt and tolerate data up to a day old, the files change once a day, and the query plan shows most of the time going to listing millions of objects. Which two changes should you make? (Choose two)
- A. Supply an explicit schema instead of autodetect so BigQuery skips reading Parquet footers at query time
- B. Cluster the BigLake table on the dt column
- C. Enable metadata caching with a max_staleness of one day Correct answer
- D. Recreate the table with HIVE_PARTITION_URI_PREFIX set to gs://lake/events so dt and country become partition columns Correct answer
- E. Grant the dashboard users Storage Object Viewer on the bucket so object listing runs under their identities
Options C and D are correct because metadata caching with a one-day max_staleness removes the repeated listing of millions of objects, which the dashboards can tolerate since the files change once a day, and recreating the table with HIVE_PARTITION_URI_PREFIX turns dt and country into partition columns so filters on dt prune the files read. Option A is wrong because an explicit schema does not affect object listing, option B is wrong because BigLake tables over Cloud Storage cannot be clustered, and option E is wrong because the listing cost is the same whichever identity performs it.
Maintaining and automating data workloads
You deployed a new version of a DAG to the Cloud Composer environment's DAGs folder. The DAG has vanished from the Airflow DAGs list, the other DAGs keep running, and no task failed. You suspect the file no longer parses. Which two sources would show why the DAG is missing? (Choose two)
- A. The Cloud Monitoring chart of worker pod evictions for the environment
- B. The dag-processor-manager log of the environment in Cloud Logging Correct answer
- C. The airflow-worker log stream for the DAG's most recent task instance
- D. The import errors notice at the top of the Airflow UI DAGs page Correct answer
- E. The Admin Activity audit log for the environment's Cloud Storage bucket
Options B and D are correct because a DAG file that fails to parse is reported by the DAG processor: the error appears in the dag-processor-manager log in Cloud Logging and as an import errors notice at the top of the Airflow UI DAGs page. Option C is wrong because a DAG that never loaded has no task instance to log, option A shows worker memory pressure rather than parse failures, and option E only shows who changed the bucket, not why the DAG is missing.
You support data scientists who prototype Spark code in Jupyter on samples under 20 GB. Their Dataproc cluster has one master and two workers and sits mostly idle. You want the cheapest cluster that still runs Spark and Jupyter. What should you create?
- A. A standard cluster with one master and one worker
- B. A single node cluster with the Jupyter optional component Correct answer
- C. A high availability cluster with three masters and two workers
- D. A standard cluster with two primary workers and Spot secondary workers
Option B is correct because a single node Dataproc cluster runs master and worker roles on one VM, and the Jupyter optional component gives notebooks on it, which is the cheapest setup for sub-20 GB prototyping. Options A, C and D all add worker VMs (and extra masters or Spot workers) that this idle, small-data workload does not need.
Developers test DAGs in a shared Cloud Composer 2 environment that was created with the Large size and a minimum of six workers. Tasks last a few minutes and fewer than ten run at once, so the scheduler, database and web server capacity of the Large size goes unused. You want the lowest cost that still lets developers run their DAGs. What should you do?
- A. Keep the Large size and lower the maximum number of workers to two
- B. Move the developers' DAGs to the production environment and share its workers
- C. Delete the environment every evening and recreate it from a snapshot each morning
- D. Change the environment size to Small and set the minimum workers to one Correct answer
Option D is correct because the Cloud Composer 2 environment size drives the scheduler, database and web server capacity, so moving from Large to Small removes the unused capacity, and a minimum of one worker removes idle worker cost while autoscaling still handles bursts. Option A keeps the Large infrastructure and conflicts with the six-worker minimum, B shares production with test DAGs, and C adds operational work and loses state.
You are moving a BigQuery project from on-demand pricing to slot reservations and must pick a baseline commitment. You need the slots consumed by all query jobs in the project, second by second, over the last 30 days, to see both sustained levels and peaks. Which source should you query?
- A. INFORMATION_SCHEMA.JOBS_BY_PROJECT, summing total_slot_ms per day
- B. The execution graphs of the most expensive jobs in the console
- C. INFORMATION_SCHEMA.RESERVATIONS_TIMELINE for the project's reservation
- D. INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT, summing period_slot_ms Correct answer
Option D is correct because INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT has one row per job per second with period_slot_ms, so summing it gives per-second slot consumption for the whole project, showing both sustained levels and peaks. Option A only gives per-job totals (total_slot_ms) with no timing, B is a per-job view, and C describes reservation usage, which does not exist under on-demand pricing.
Free Study Guide
Read the free Google Cloud Professional Data Engineer study guide: every exam topic explained in plain English, with diagrams, exam tips and the mistakes to avoid.
More Google Cloud Practice Exams
- Google Cloud Digital Leader Practice Exam
- Google Cloud Generative AI Leader Practice Exam
- Google Cloud Associate Cloud Engineer Practice Exam
- Google Cloud Professional Cloud Architect Practice Exam
- Google Cloud Professional Machine Learning Engineer Practice Exam
- Google Cloud Professional Cloud Security Engineer Practice Exam
- Google Cloud Professional Cloud DevOps Engineer Practice Exam
Practise with realistic mock exams to prepare for your Google Cloud certification.