Serverless Transformation with AWS Glue and DataBrew
Build Domain 1 transformation judgment from the ground up: how the AWS Glue serverless job model, Data Catalog, DynamicFrames, job bookmarks and triggers fit together; how to size workers and price DPU-hours on the October 2026 rate card; when AWS Glue DataBrew's recipes and profiling beat hand-written ETL; and how error tables, retries, job insights, partitioned writes and small-file hygiene keep a pipeline correct, with four AWS customer case studies, a sourced 2026 update box, an interactive price chart and fourteen exam-style questions.
Transformation is where a data engineer's judgment becomes visible. Ingestion can be bought as a managed pipe; storage can be rented by the gigabyte. But deciding which engine runs the job, how much capacity it holds while it runs, which records are processed on the second run, and where rejected rows go; that is design work, and it is exactly what DEA-C01 Domain 1 (Data Ingestion and Transformation, 34% of the exam; weights per the DEA-C01 exam guide, accessed Oct 2026) examines through the task statements "preparing data for transformation (AWS Glue DataBrew)", "using AWS Glue features to process data" and "using Lambda to automate data processing".
====================================================================
THE TRANSFORMATION DECISION SURFACE (DEA-C01 Domain 1)
====================================================================
Engine ............ AWS Glue Spark (serverless ETL)
AWS Glue Python shell (single process)
AWS Glue streaming (Spark Structured Streaming)
AWS Glue Ray (Z.2X workers)
AWS Glue DataBrew (no-code recipes + profiling)
AWS Lambda (sub-15-minute micro-transforms)
Data representation .. DynamicFrame (self-describing, choice types)
vs DataFrame (schema must resolve)
Incrementality ....... job bookmarks (batch) / checkpoints + watermarks
(streaming)
Orchestration ........ triggers: scheduled | conditional | on-demand
| event (EventBridge)
Capacity ............. worker types G./R./Z. + NumberOfWorkers,
billed in DPU-hours (1 DPU = 4 vCPU + 16 GB)
Failure design ....... error tables, Spigot, EvaluateDataQuality,
retries, timeouts, job run insights
====================================================================In this lesson you will:
- model the serverless Glue job: job types, anatomy, Data Catalog integration, run states and timeouts;
- separate DynamicFrame from DataFrame and drive
resolveChoice→apply_mapping→toDF()in the right order; - operate job bookmarks: Enable / Disable / Pause,
job.initandjob.commit,transformation_ctxas the state key, and the five ways they break; - wire triggers into serial, conditional and scheduled topologies, and know the two hard trigger limits;
- size workers and DPU-hours on the October 2026 price list, including the G-versus-R memory trap and the crawler's 10-minute minimum;
- author with Glue Studio visual ETL: nodes, notebooks, the data-preview session and the Recipe node's import limits;
- pick DataBrew correctly: its six core objects, the 100-step recipe ceiling, recipe versus profile jobs, and its non-DPU metering;
- design error handling:
ErrorsAsDynamicFrame,Spigot,EvaluateDataQuality, retries, timeout defaults and where error tables live; - tune performance: partitioned writes, job run insights, input-file grouping, small-file arithmetic and Glue auto scaling;
- study four AWS customer case studies (BMW Group, PayU, Integral Ad Science and Nasdaq) and a sourced October 2026 update box;
- practise with 14 exam-style questions plus four interactive checks.
1. Glue ETL fundamentals: a serverless Spark engine with a catalog attached
1.1 What "serverless" means here
AWS Glue is a serverless ETL service: you define a job, AWS provisions and tears down the Spark (or shell) execution environment, and you pay only while the job runs, billed per second (jobs and interactive sessions bill in 1-second increments, rounded up, with a 1-minute minimum for Spark jobs: AWS Glue pricing, accessed Oct 2026). There is no cluster to keep warm, no AMI to patch, and no node to deprecate. The Data Catalog that crawlers populate is the glue between storage and compute: schemas live in the catalog, data lives in S3 (or JDBC sources), and jobs read both.
1.2 Job types and languages
Job type | JobCommand.Name | Runtime | Priced as | Exam fit |
|---|---|---|---|---|
Spark ETL | glueetl | PySpark / Scala on Spark | DPU-hour (1-min min) | Bulk GB: TB transforms, joins, partitioned lake writes |
Spark streaming | gluestreaming | Spark Structured Streaming | DPU-hour (default 2 DPU) | Continuous micro-batch from Kinesis/Kafka sources |
Python shell | pythonshell | Single-process Python 3.9 (Glue 3.0+) | DPU-hour at 0.0625 or 1 DPU | >15-minute non-Spark work: API pulls, file moves, light SQL |
Ray | ray (worker Z.2X) | Ray on Python | M-DPU-hour | Parallel Python (for example Pandas-style) workloads |
Authoring routes: PySpark/Scala scripts, Python (shell or Ray), Glue Studio visual authoring, and interactive notebooks (Pandas on Spark, Spark SQL). A Glue job is assembled from: the command, worker type and count, an IAM role, optional connections, an optional security configuration, triggers, a timeout, retries, default arguments, and MaxConcurrentRuns.
MaxConcurrentRuns defaults to 1, and AWS's jobs API states plainly: "The default is 1. An error is returned when this threshold is reached." That default is also your first line of defence for job bookmarks, which are not concurrency-safe (Section 3).
1.3 Run states, timeouts and history
Item | Value (AWS Glue API, accessed Oct 2026) |
|---|---|
Run states | STARTING RUNNING STOPPING STOPPED SUCCEEDED FAILED TIMEOUT ERROR WAITING EXPIRED |
WAITING | the run is queued: capacity or trigger position, not a failure |
Timeout default | 2,880 minutes on Glue 4.0 and earlier · 480 minutes on Glue 5.0 and later |
Timeout ceiling | must be less than 7 days (10,080 minutes) |
Retries | MaxRetries; NotifyDelayAfter raises an alert when a run is delayed |
Run history | retained 90 days |
1.4 Job anatomy and Data Catalog integration
Two properties of that diagram are examinable:
- The catalog is metadata, not storage. Crawlers bill separately from jobs (Section 5), and a job can run with or without a crawler in the same trigger chain.
- Bookmark state lives outside the script.
job.initreads it,job.commitwrites it, and neither call is optional if you enabled bookmarks (Section 3).
- 📚 Did you know? Glue records every run with its state and keeps the 90 days of history, and
WAITINGsimply means queued. Combined withMaxConcurrentRunsdefaulting to 1, a run that appears "stuck" inWAITINGis telling you about capacity or trigger position: not about your code (AWS Glue job-runs API, accessed Oct 2026).
2. DynamicFrame versus DataFrame: the single most-tested Glue concept
2.1 The two representations
Property | DataFrame (Spark) | DynamicFrame (Glue) |
|---|---|---|
Schema requirement | Schema must resolve before most operations | "Each record is self-describing, so no schema is required initially" (AWS Glue developer guide, accessed Oct 2026) |
Ambiguous values | Widens to the most general type (usually string) or fails | Carries a genuine choice type, for example choice<long,string>, when rows disagree |
Row-level errors | Fails or silently coerces | Preserved as error rows ( ErrorsAsDynamicFrame) |
Transformation API | DataFrame methods | Glue transforms: resolveChoice, apply_mapping, Relationalize, Join, Spigot, EvaluateDataQuality, … |
Conversion | : | toDF() only after choices are resolved |
2.2 Why choice types appear: the crawler sampling trap
AWS's own sample (Medicaid provider data) is the canonical illustration: a crawler that inspected only a 2 MB prefix inferred the provider-id column as long. A DataFrame built over the whole dataset met values the sample never saw and forced everything to string. A DynamicFrame correctly reported choice<long,string>: the rows genuinely disagreed. The bug is in the schema inference sample, not in the data, and the fix belongs in the script.
2.3 resolveChoice: settle the ambiguity
resolveChoice(specs=…, choice=…, database=…, table_name=…) offers four actions for a choice column (AWS API reference, accessed Oct 2026):
Action | What it does | Side effect you must predict |
|---|---|---|
cast:TYPE | Convert every value to TYPE | Values that cannot convert become null |
project:TYPE | Keep only the values already of TYPE | The other type's values are dropped |
make_cols | One column per type: col_long, col_string | Schema widens to sibling columns |
make_struct | Nest both into a struct | Downstream code must read struct fields |
MATCH_CATALOG (via database + table_name) | Align to the catalog's declared type | Requires a catalog table |
choice<long,string> --cast:long--> long (uncastable -> null)
--project:long--> long (strings dropped)
--make_cols--> provider_id_long + provider_id_string
--make_struct--> {c_long, c_string}2.4 apply_mapping: rename, cast, nest, drop
apply_mapping(mappings, case_sensitive=False, …) takes a list of four-tuples:
(source_column, source_type, target_column, target_type)
("provider id", "string", "provider.id", "string") # dotted target nests
("zip", "string", "zip", "bigint") # cast in place
("legacy_col", "string", "", "") # target empty -> dropRules that cost marks on the exam: backtick a source name that contains a literal dot; a dotted target creates a nested field (provider.id); and case_sensitive defaults to False.
2.5 The order is not negotiable
⚠️ resolveChoice before apply_mapping before toDF(). apply_mapping assumes a settled per-column type; converting to a DataFrame with an unresolved choice forces the column to a general type (usually string) and quietly defeats the cast you were about to perform. Order is the difference between a clean bigint key and a table of padded strings.
2.6 Worked example E1: ambiguous provider IDs
Input : 160,000 rows, column "provider id"
crawler (2 MB sample) says long | 2 rows say string | DynamicFrame says choice<long,string>
Step 1 resolveChoice([('provider id', 'cast:long')])
-> column is long; the 2 uncastable values become null
Step 2 apply_mapping([('provider id','long','provider.id','long'),
('name','string','name','string'),
('legacy_flag','string','','')]) # nest + drop
Step 3 toDF() -> schema is now fixed and typed
Step 4 sink.write(frame, format='parquet',
partitionKeys=['year','month','day'])
Reading: cast is lossy (nulls), project is destructive (drops rows' values),
make_cols is additive, make_struct is restructuring.2.7 Built-in DynamicFrame transforms worth naming
RelationalizeUnnestFrameMapFlatMapJoinSpigotErrorsAsDynamicFrameEvaluateDataQualityFlagDuplicatesInColumnSelectFieldsDropFieldsFillMissingValuesmergeDynamicFrameFindMatches(AWS PySpark transforms reference, accessed Oct 2026)
The exam tests recognition: which transform routes rejects, which samples output, which tests rules.
How to answer
Ordering exercise with 5 items. Move them into the correct order, then check your answer.
Order the Glue DynamicFrame pipeline the way AWS documents it:
3. Job bookmarks: incremental batch processing without duplicates
3.1 The three modes
Mode | Behaviour | Default? |
|---|---|---|
Enable | Updates bookmark state each run and processes only the delta since the last commit | No |
Disable | Processes the whole dataset every run | Yes |
Pause | Processes incrementally but does not update the state | No |
3.2 How state is kept
The bookmark state is stored by the Glue service as roughly {job_name, run_id, run_number, attempt_number, states: {transformation_ctx: state}}, keyed by job name plus version. Your script participates through exactly two calls: job.init reads the state at start, job.commit writes it at the end. AWS's developer guide is blunt: "Bookmarks won't work without calling them."
And the key rule, verbatim from the AWS bookmarks page:
"The
transformation_ctxserves as the key to search the bookmark state for a specific source in your script. For the bookmark to work properly, you should always keep the source and the associatedtransformation_ctxconsistent."
3.3 Worked example E2: the delta arithmetic
Dataset: s3://raw/orders/ with 1,000 files at first enablement.
Run 1 (bookmarks just enabled): 320 new files -> processed 320, state -> 320
Run 2: 410 new files -> processed 410, state -> 730
Run 3: 270 new files -> processed 270, state -> 1,000
Files processed across three runs: 320 + 410 + 270 = 1,000
Naive full-reprocess total: 1,000 x 3 = 3,000
Without state continuity the tempting wrong figure is 320+410+270 counted
against a reset state, or 2,680 if run 1 had pre-dated enablement.
Lesson: bookmarks deduplicate OUTPUT relative to tracked SOURCES - the
state is the only thing that remembers what "already processed" means.3.4 When bookmarks break (the exam's favourite failure list)
Failure | What actually happens |
|---|---|
You change a source path but keep the same transformation_ctx | State no longer matches reality → files skipped or missing |
Two runs execute concurrently | Commits race; state becomes unreliable → keep MaxConcurrentRuns = 1 |
You expect a rewind | There is none. Reset exists; rewind does not |
reset-job-bookmark | Resets all transformations in the job at once, and does not delete outputs you already wrote |
You assume targets are tracked | Only source files are tracked, never destinations |
You delete the Glue job | Its bookmark is deleted with it |
JDBC source with no bookmark key | You must choose the bookmark key columns yourself |
Streaming job | Bookmarks are the wrong mechanism: streaming uses checkpointLocation + watermarks |
- 📚 Did you know? AWS's own wording for the guarantee is that bookmarks "prevent duplicate processing and duplicate data": the phrase "exactly-once" is shorthand the exam world uses, but the honest model is at-least-once processing with de-duplicated outputs, because only sources are tracked and a failed run between
job.initandjob.commitleaves state untouched. Never claim a target-side guarantee you cannot point at in the state structure (AWS Glue developer guide, accessed Oct 2026).
How to answer
Fill-in-the-blank exercise with 6 blanks. Type the missing words, then check your answer.
Complete the job-bookmark statements with the AWS developer guide's own vocabulary:
Bookmark state is keyed by blank plus a version, and the per-source key inside the state is the blank of the source. The script must call blank at start and blank at completion: AWS states bookmarks will not work without calling them. The three modes are blank (default, whole dataset), Enable (delta, state updated) and Pause (delta, state not updated), and state is reset with the CLI command blank.
Word Bank, drag words into the blanks above:
4. Triggers: serial, conditional and scheduled topologies
4.1 The four trigger types
API Type | Console name | Fires when |
|---|---|---|
SCHEDULED | Scheduled | A cron expression elapses |
CONDITIONAL | Conditional | A predicate list of watched jobs/crawlers reaches the required statuses, joined by Logical AND / OR |
ON_DEMAND | On-demand | You activate it (API/console/CLI) |
EVENT | (API-level) | An EventBridge event, with EventBatchingCondition {BatchSize, BatchWindow} |
4.2 The rules that make conditional triggers work
- Watched jobs must themselves have been started by a trigger. A job you started by hand and that then succeeded will not fire a conditional trigger.
- The chain must descend from a single scheduled or on-demand root trigger.
- Limits: maximum 2 crawlers per trigger; maximum 50 jobs per trigger (AWS Glue quotas, accessed Oct 2026).
Serial vs parallel in one line each: serial = J3 fires when J1 AND J2 both SUCCEEDED; fan-out = J4 fires when J1 OR J2 FAILED. That is the whole conditional-trigger grammar: plus the root-trigger rule, which is where most candidate mistakes live.
5. Worker types and DPU sizing: where the bill comes from
5.1 The unit
1 DPU = 4 vCPU and 16 GB of memory, and AWS states that "a single DPU is also referred to as a worker." Jobs on Glue 2.0 and later are sized with WorkerType + NumberOfWorkers: never with MaxCapacity (that legacy field belongs to Glue 1.0 and earlier; setting both is an error). Defaults: Spark jobs 10 DPU, streaming 2 DPU, both with a 2-DPU minimum.
5.2 Worker catalogue (as of Oct 2026)
Worker | DPU per worker | vCPU | Memory | Disk (free) | Constraint |
|---|---|---|---|---|---|
G.1X | 1 | 4 | 16 GB | 94 GB (44 GB free) | All Spark; default for Glue ≥2.0 |
G.2X | 2 | 8 | 32 GB | 138 GB (78 GB free) | Recommended for ML transforms |
G.4X | 4 | 16 | 64 GB | 256 GB (230 GB free) | Glue ≥3.0 (limited Regions) |
G.8X | 8 | 32 | 128 GB | 512 GB (485 GB free) | Glue ≥3.0 (limited Regions) |
G.12X | 12 | 48 | 192 GB | 768 GB (741 GB free) | Glue ≥4.0 |
G.16X | 16 | 64 | 256 GB | 1024 GB (996 GB free) | Glue ≥4.0 |
G.025X | 0.25 | 2 | 4 GB | 84 GB (34 GB free) | Streaming only, ≥3.0 |
R.1X / R.2X / R.4X / R.8X | 1 / 2 / 4 / 8 M-DPU | 4 / 8 / 16 / 32 | 32 / 64 / 128 / 256 GB | same as G peers | Memory-optimized (≥4.0) |
Z.2X | 2 M-DPU | 8 | 64 GB | 128 GB (~120 GB free) | Ray only, up to 8 Ray workers |
M-DPU means "double the memory allocation for a given size compared to standard DPUs."
⚠️ The G-family does not buy you memory per CPU. Every G worker keeps the 4 vCPU: 16 GB ratio; only the R. family doubles it (4 vCPU: 32 GB). Moving from G.1X to G.4X therefore does not fix an out-of-memory failure; it just gives you the same ratio four times faster and four times wider. OOM → R.; shuffle/skew → more workers; genuinely slow single-threaded work → bigger worker.
5.3 The October 2026 rate card
Baseline us-east-1 (N. Virginia); every figure as of Oct 2026 (Glue 6.0 rates announced 2026-08-21):
Meter | Glue ≤5.1 | Glue ≥6.0 | Billing minimum |
|---|---|---|---|
Spark / Spark Streaming job | $0.44 / DPU-hour | $0.308 / DPU-hour | 1 second, rounded up; 1-minute minimum |
Flex execution (G.1X/G.2X, ≥3.0) | $0.29 / DPU-hour | see live pricing page | 1 minute; start delay/interruption possible |
Memory-optimized R workers (≥4.0) | $0.52 / DPU-hour | see live pricing page | 1 minute |
Interactive session / Studio notebook | $0.44 / DPU-hour | $0.308 / DPU-hour | 1 minute; default 5 DPU, minimum 2 DPU |
Python shell (0.0625 or 1 DPU) | $0.44 / DPU-hour | : | 1 minute |
Ray | $0.44 / M-DPU-hour | : | 1 minute |
Data Catalog crawler | $0.44 / DPU-hour | : | 10-minute minimum per run |
Data Quality evaluated in an ETL job | $0.44 / DPU-hour | $0.308 / DPU-hour | 1 minute |
DataBrew recipe/profile job | $0.48 / node-hour | : | per node |
DataBrew interactive session | $1.00 / 30-minute block | : | counted from first interaction |
The four DPU-based meters of that table as an interactive chart (same units, so they are legitimately comparable: DataBrew's node-hour meter is deliberately not plotted, because it is a different unit):
Reading the chart: total cost = DPU × hours × bar height. The 6.0 bar is ~30% shorter than the 5.1 bar (the 2026-08-21 price cut), Flex buys ~34% off in exchange for a possible delayed start or interruption, and the R bar is the premium for double memory per DPU.
5.4 Worked example E3: AWS's own DPU-hour arithmetic
Job: 6 DPU (for example 6 x G.1X) running 15 minutes on Glue <= 5.1
Cost = 6 DPU x 0.25 h x $0.44 / DPU-h = $0.66 per run (as of Oct 2026)
Same job on Glue 6.0:
Cost = 6 x 0.25 x $0.308 = $0.462 per run
Saving per run = $0.66 - $0.462 = $0.198 (~30%)
30 runs per month = 30 x $0.198 = $5.94 per month
Source: AWS Glue pricing page's worked example ("6 DPU * 0.25 hour * $0.44,
or $0.66"), as of Oct 2026; 6.0 rate from the 2026-08-21 announcement.5.5 Worked example E4: Flex versus standard
Job: 6 DPU x 1/3 hour (as of Oct 2026)
Standard: 6 x 0.3333 x $0.44 = $0.88
Flex: 6 x 0.3333 x $0.29 = $0.58 (AWS's own worked example)
Flex buys ~34% off by accepting a possible delayed start and interruption.
Never use Flex for SLA-bound work; it exists for interruptible, fault-tolerant jobs.5.6 Worked example E5: worker choice changes nothing about the price
Target capacity: 16 DPU (as of Oct 2026, $0.44/DPU-h on Glue <= 5.1)
16 x G.1X = 16 workers x 1 DPU = 16 DPU -> 16 x $0.44 = $7.04 / hour
8 x G.2X = 8 x 2 = 16 DPU -> 16 x $0.44 = $7.04 / hour
4 x G.4X = 4 x 4 = 16 DPU -> 16 x $0.44 = $7.04 / hour
2 x G.8X = 2 x 8 = 16 DPU -> 16 x $0.44 = $7.04 / hour
Identical cost, different shapes: 16 executors on G.1X vs 2 on G.8X,
16 GB vs 128 GB per worker. Choose on parallelism and memory per executor,
never on price - the DPU is the metered unit.5.7 Worked example E6: the crawler's 10-minute minimum
Crawler runs hourly, 2 DPU, actual work takes 3 minutes (as of Oct 2026).
Billed per run: 2 DPU x (10/60) h x $0.44 = $0.147 <- 10-min minimum
Runs per 30-day month: 24 x 30 = 720
Monthly: 720 x $0.147 = $105.60
At true 3-minute duration: 720 x (2 x 0.05 x $0.44) = $31.68
Hidden premium from the minimum: $105.60 - $31.68 = $73.92 / month
Exam move: crawl on event (conditional trigger after the job SUCCEEDED)
instead of hourly, or batch partition discovery, before you optimise DPU.5.8 Auto scaling and the legacy MaxCapacity
For Glue 3.0 and later, auto scaling is enabled with --enable-auto-scaling=true on worker families G.1X…G.16X and R.1X…R.8X (G.025X for streaming); the Standard worker does not support it. When auto scaling is on, NumberOfWorkers is treated as the maximum, and batch jobs on Glue 4.0+ can be reviewed with the DPUSeconds CloudWatch metric. Data Catalog pricing adds its own meter: the first 1,000,000 objects and 1,000,000 requests are free each month, then $1.00 per 100,000 objects over the free tier and $1.00 per million requests over it (as of Oct 2026).
- 📚 Did you know? A DataBrew job is not priced in DPU-hours at all: it is $0.48 per node-hour with a 5-node default, and an interactive DataBrew session is $1.00 per 30-minute block: three separate interactions inside 75 minutes bill as three blocks = $3.00 (AWS Glue/DataBrew pricing, as of Oct 2026). Mixing the two meters is a classic cost-estimate trap.
6. Glue Studio: visual ETL over the same engine
6.1 What the visual layer actually is
Glue Studio lets you create, run and monitor Glue jobs on the serverless Spark engine "without having to learn Spark or write code." Each node in the canvas is one action, a source, a transform or a target, and Studio generates a PySpark script from the source schema plus the target location and schema. The script is real and editable in developer mode; the visual graph and the code are two views of the same job.
Authoring mode | What you get |
|---|---|
Visual ETL | Canvas of source/transform/target nodes; generated script |
Interactive notebook | Pandas on Spark or SQL cells against an interactive session |
Script editor | Hand-written PySpark/Scala |
6.2 Sessions, previews and monitoring
- Data preview session: 2 DPUs for up to 30 minutes, auto-stops, billed at the standard DPU rate (as of Oct 2026).
- Monitoring: the Jobs page and run details, plus the job run monitoring dashboard with tiles for success rate and estimated DPU usage, links into CloudWatch, the Spark History Server and job-run insights.
- Logs:
/aws-glue/jobs/logs-v2(continuous logging),/aws-glue/jobs/output,/aws-glue/jobs/error; CloudWatch metrics arrive every 30 seconds as deltas.
6.3 The Data Preparation Recipe node: DataBrew inside Studio
You can author a recipe step inline in Studio or import a published DataBrew recipe into a Data Preparation Recipe node, subject to hard limits (AWS Glue Studio docs, accessed Oct 2026):
Rule | Value |
|---|---|
Minimum Glue version | 4.0 (Python version auto-set) |
Not importable | GROUP_BY, PIVOT, UNPIVOT, TRANSPOSE: use dedicated Studio nodes |
Unsupported if the recipe contains | UNION or JOIN: use Studio's Join/Union nodes instead |
Region requirement | Commercial DataBrew Regions only |
That bridge is why DataBrew and Glue Studio are on the exam together: a recipe authored by an analyst becomes a governed step inside an engineer's scheduled job, which then gains bookmarks, retries and auto scaling it never had as a standalone DataBrew job.
7. AWS Glue DataBrew: preparation and profiling without code
7.1 Six core objects, and the name that does not exist
AWS Prescriptive Guidance lists exactly six core concepts (accessed Oct 2026):
Object | Role |
|---|---|
Project | The workspace where a dataset and a recipe meet |
Dataset | A read-only reference to a source (S3, Glue catalog tables, …) |
Recipe | An ordered list of transformation steps with optional condition expressions |
Job | Either a recipe job (apply a recipe version) or a profile job (compute statistics) |
Data lineage | Record of what the recipe did to the data |
Data profile | The statistical output of a profile job (JSON to S3) |
⚠️ There is no DataBrew object called a "data flow." The six objects above are the complete vocabulary; a "flow" is loose language for a Glue Studio visual graph or for a recipe itself. An exam option that asks you to "create a DataBrew data flow" is testing whether you know the real object names.
7.2 Recipes: bounded, versioned, point-and-click
- A recipe is an ordered list of
RecipeActionobjects (Action.Operation+Parameters+ optionalConditionExpressions). - Maximum 100 transformations per recipe; maximum 100 published versions per recipe (AWS quotas, accessed Oct 2026).
- Scale of the library: more than 250 point-and-click transformations (product page) / more than 200 recipe actions (developer guide).
- Exam-relevant operations:
SPLIT,GROUP_BY,REPLACE_TEXT,REMOVE_VALUES,CHANGE_DATA_TYPE,PIVOT,UNPIVOT,TRANSPOSE,NEST,UNNEST, and Remove duplicates.
7.3 Jobs, schedules and data-quality rulesets
Knob | Value (as of Oct 2026) |
|---|---|
Recipe job output | Amazon S3 · Glue Data Catalog · Amazon Redshift |
Profile job output | Statistical evaluation as JSON to S3 |
Schedule syntax | Six-field cron; day-of-month and day-of-week are mutually exclusive ( ?) |
Minimum schedule interval | Cron expressions faster than 5 minutes are not supported |
Rulesets | 100 rules per ruleset, 10 rulesets per dataset, 100 rulesets per account |
Account quotas | 10 concurrent jobs · 300 nodes per account · 100 jobs · 100 datasets · 100 projects · 10 open projects · 500 recipes · 10 schedules |
7.4 Worked example E7: pricing a DataBrew pipeline
Recipe job: 5 nodes (the default), runs 10 minutes (as of Oct 2026)
Cost = 5 nodes x (10/60) h x $0.48 / node-hour = $0.40 per run
Analyst interactive day: 3 sessions inside 75 minutes
Cost = 3 x $1.00 / 30-minute block = $3.00
Hourly scheduled recipe job for a month (worst case, 720 runs):
720 x $0.40 = $288.00 vs the same job as Glue ETL only if a Spark job
is genuinely needed - the meters are NOT interchangeable.7.5 When to pick DataBrew, when to pick Glue
Dimension | DataBrew | Glue ETL (Spark) |
|---|---|---|
Code | None: point and click | PySpark/Scala (or Studio-generated) |
Best for | Prep, cleansing, profiling, analyst self-service | Bulk transforms, joins, distributed processing |
Meter | $0.48 / node-hour + $1.00 / 30-min session | DPU-hour |
Bookmarks / retries / auto scaling | Only after a recipe is imported into Glue Studio | Native |
Hard ceiling | 100 transformations per recipe | Script length, not steps |
Data quality | Rulesets on datasets, run inside jobs | EvaluateDataQuality node/transform |
- 📚 Did you know? AWS claims DataBrew can cut data-preparation time by up to 80% versus custom preparation work (AWS Glue DataBrew product page, accessed Oct 2026): a customer-facing claim, not a guarantee, and the examinable fact is the mechanism (project → dataset → recipe → recipe/profile job), not the percentage.
How to answer
Matching exercise with 6 pairs. Match each item on the left with its answer on the right.
Match each AWS Glue DataBrew object to what it actually is:
Drag answers from here:
8. Error handling: reject rows, retries, and where failures go
8.1 The three in-script patterns
Pattern | Mechanism | Use when |
|---|---|---|
Error table | ErrorsAsDynamicFrame (or errorsFromDF) routes rejected records into a separate DynamicFrame instead of failing the run | Schema violations must be captured, not fatal |
Spigot | Diverts a sample of records to a rejects path | You want a canary, not every reject |
EvaluateDataQuality | Rule evaluation (Studio: "Data quality rules" node) that can fail or divert on violation | Rules are declarative and auditable |
The rejected frame is then written to its own prefix; that is the error table pattern the exam means: bad rows land in s3://…/errors/, good rows land in the partitioned sink, and a downstream conditional trigger or analyst query can read each independently.
⚠️ There is no Glue feature called "ErrorCDC." A search of the Glue developer guide, API reference and release notes (checked Oct 2026) returns nothing under that name. The real mechanisms are ErrorsAsDynamicFrame, errorsFromDF, Spigot and EvaluateDataQuality: if an option uses a name you have never seen in the docs, treat it as a distractor and pick the documented mechanism.
8.2 Retries, timeouts and run states
Job failure ladder (AWS Glue job-runs API):
transient fault -> MaxRetries (configured on the job) -> re-attempt
long queue -> state WAITING (queued, not failed)
NotifyDelayAfter -> alert raised while the run is delayed
over limit -> state TIMEOUT (default 480 min on Glue >= 5.0,
default 2,880 min on Glue <= 4.0,
hard ceiling < 10,080 min = 7 days)
unhandled error -> state FAILED or ERROR; history retained 90 days8.3 Worked example E8: the timeout default trap
A pipeline was designed in 2024 on Glue 4.0, where a blank Timeout
defaults to 2,880 minutes (48 hours). The team upgrades to Glue 5.1/6.0
and leaves Timeout blank -> default is now 480 minutes (8 hours).
Job runtime: 60 hours = 3,600 minutes
Outcome: state TIMEOUT at 480 minutes, long before completion.
Fix: set an explicit timeout (always < 10,080 minutes) and treat the
default as version-dependent, not as a constant. (Defaults as of Oct 2026.)8.4 Security configuration: four planes, one override rule
A security configuration is a named bundle attachable to a job, crawler or development endpoint, covering four planes: S3 data (SSE-S3 or SSE-KMS), CloudWatch Logs (SSE-KMS), job bookmarks (CSE-KMS: client-side) and data-quality assets. Three rules worth memorising:
- "Currently, a security configuration overrides any server-side encryption (SSE-S3) setting that is passed as an ETL job parameter."
- Only symmetric KMS keys are supported, and security configurations are not supported for Ray jobs.
- The job role needs KMS permissions plus
logs:AssociateKmsKey. Catalog encryption is a separate, account-level setting (CatalogEncryptionMode:DISABLED,SSE-KMS,SSE-KMS-WITH-SERVICE-ROLE).
9. Performance: insights, partitions and the small-file tax
9.1 Job run insights: the fastest path to a root cause
Available on Glue 2.0 and later, opt-in via the Studio checkbox "Generate job insights" or --enable-job-insights=true. When enabled, a failed run reports (AWS Glue docs, accessed Oct 2026):
- the failing script line,
- the last Spark action,
- the time-ordered exception stream, and
- a root cause with a recommended action.
Compare that with the bare failure An error occurred while calling o111.collectToPython: one is a diagnosis, the other is a symptom. Insights land under the same /aws-glue/jobs/logs-v2 log group you already ship to CloudWatch.
9.2 Partitioned writes and pushdown
Write partition keys with the sink (partitionKeys = ["year","month","day"]) so downstream readers only touch the partitions a query names. Partitioning is a write-time decision you cannot cheaply retrofit on a flat prefix, which is why the sink belongs in the design conversation, not in the cleanup sprint. Partition-aware outputs are also what makes crawlers cheap to run: the crawler registers partitions, and a partitioned table is what lets an engine skip files it will never read.
9.3 Worked example E9: small-file arithmetic
Ingest: 1 TB per year of raw events, partitioned year/month/day,
128 output files per partition (as of Oct 2026 - file counts are
structural arithmetic, not an AWS limit).
Partitions per year = 365
Output files per year = 365 x 128 = 46,720 files
Average file size = 1 TB / 46,720 ~= 21 MB (before compression)
Every one of those files is an object, a listing entry, a task input and
a metadata row. Remedies on the Glue side:
- groupFiles / groupPartition: auto-grouping kicks in beyond ~50,000
input files so one task reads a GROUP of files;
- coalesce(n) / repartition(n) to tune the OUTPUT file count;
- without grouping, the driver can run out of memory on file metadata
alone (AWS Glue input-grouping and Spark-scaling guidance).9.4 What to check before you buy more DPU
1. Skew - one hot key; more workers will not help, salt or pre-aggregate
2. Too many tasks- small files; group inputs, coalesce outputs first
3. Wrong worker - OOM on G.*? move to R.* (4 vCPU : 32 GB), not up the G ladder
4. Auto scaling - Glue >= 3.0, --enable-auto-scaling=true, NumberOfWorkers = max
5. Version - Glue 5.1 vs 6.0 changes the per-DPU price by ~30% (as of Oct 2026)
6. Meter - is this even a DPU job? 0.0625-DPU pythonshell or Lambda may fit10. Connections, encryption and the version ladder
10.1 Connections are catalog objects, not job settings
"An AWS Glue connection is a Data Catalog object that stores login credentials, URI strings, virtual private cloud (VPC) information…"
Connections are therefore reusable across crawlers, jobs and development endpoints. Types include JDBC, NETWORK, MARKETPLACE, CUSTOM, KAFKA, MONGODB, SFTP (AWS notes SFTP is currently not supported) and the SaaS/database families (MYSQL, ORACLE, POSTGRESQL, SQLSERVER, SYNAPSE, TERADATA, OPENSEARCH, SALESFORCE, …). For JDBC you supply either HOST/PORT/JDBC_ENGINE or a full JDBC_CONNECTION_URL, plus USERNAME/PASSWORD or SECRET_ID, with SSL toggles. Inside a VPC, Glue creates an ENI; security groups need a self-referencing inbound rule for all TCP ports, and egress requires a NAT gateway or VPC endpoints. Limits: 1,000 connections per account, and ConnectionsList per job also caps at 1,000.
10.2 The version ladder (as of Oct 2026)
Glue version | Spark | Python | Status |
|---|---|---|---|
6.0 | 4.1.1 | 3.13 | GA 2026-08-21, −30% pricing, Iceberg v3, Java 17 / Scala 2.13.17 |
5.1 | 3.5.6 | 3.11 | Default when GlueVersion is omitted (since 2025-11-26) |
5.0 | 3.5.4 | 3.11 | Supported; timeout default already 480 min |
4.0 | 3.3.0 | 3.10 | Supported; timeout default 2,880 min |
3.0 | 3.1.1 | 3.7 | Supported; ML transforms unavailable |
2.0 / 1.0 / 0.9 | 2.4.3 | 3.7 / 2.7-3.6 | End of life 2026-04-01 |
Glue 6.0 migration deltas that break old scripts: spark.sql.legacy.timeParserPolicy default changed; ANSI mode can fail implicit string→numeric casts; --additional-python-modules is deprecated in favour of --python-virtual-env; EMRFS is removed (S3A is the only S3 filesystem); and the AWS SDK for Java v1 is removed (SDK v2 only: boto3 is unaffected).
10.3 Choosing the engine in one table
Dimension | AWS Lambda | Glue Spark | Glue Python shell |
|---|---|---|---|
Max runtime | 15 minutes (hard) | default 480 min (≥5.0) / 2,880 min (≤4.0), always < 7 days | same Glue timeout rules |
Parallelism | one invocation ≈ one worker | distributed Spark with shuffles | single process |
Trigger surface | 220+ service events, SQS/Kinesis/DynamoDB, API Gateway | Glue triggers, EventBridge, Step Functions | same as Glue |
Cost meter | GB-second + requests | DPU-hour (1-second granularity, 1-minute minimum) | DPU-hour (0.0625 or 1 DPU) |
Fit | sub-15-minute event micro-transforms | bulk GB: TB, joins, partitioned lake writes | >15-minute non-Spark Python |
10.4 Worked example E10: "the cheapest correct option"
Requirement: every night at 03:00, move one ~90-second file-copy job,
small payload, no Spark, no shuffle, SLA is loose.
A) Glue etl job, 2 DPU minimum, 1-minute billing
-> correct engine family, but you pay for 2 DPU for the whole
(admittedly short) run: 2 x (1/60) x $0.44 = $0.0147/run floor,
plus the trigger and script overhead. (as of Oct 2026)
B) Glue pythonshell at 0.0625 DPU
-> 0.0625 x (1/60) x $0.44 = $0.00046/run - Glue-native, no Spark.
C) AWS Lambda
-> GB-second metering, no DPU floor, 15-minute ceiling is irrelevant.
Reading: "must run on Glue" -> pythonshell. "Cheapest correct" -> Lambda.
"Needs distributed shuffles" -> neither; use glueetl.2026 Updates (as of October 2026)
What changed in this topic between 2025 and October 2026: every line is checked against a primary AWS source and is examinable because the exam tests the current behaviour:
- Glue 6.0 went GA on 2026-08-21 with "30% lower pricing than previous AWS Glue versions" and full Apache Iceberg v3 support (Spark 4.1.1, Python 3.13, Scala 2.13.17, Java 17; Iceberg 1.11.0, Hudi 1.1.1, Delta 4.2.0): AWS What's New, 2026-08-21; Glue release notes, accessed Oct 2026.
- Glue 5.1 is the default when
GlueVersionis omitted (announced 2025-11-26 / blog 2025-12-09), and 0.9/1.0/2.0 reached end of life on 2026-04-01; new Python Shell 3.6 jobs could no longer be created after 2026-03-31: Glue version support policy, accessed Oct 2026. - 6.0 breaks old code: EMRFS removed (S3A only), AWS SDK for Java v1 removed, Scala binary 2.12 → 2.13,
--additional-python-modulesdeprecated for--python-virtual-env, and ANSI mode can fail implicit string→numeric casts: migrating to Glue 6.0, accessed Oct 2026. - Exam guide v1.1 (2025-12-12) consolidated knowledge/skills into one list and added 8 new skills, none removed, including 1.2.10 Integrate Large Language Models (LLM) for data processing and 2.1.7 Manage open table formats (for example Apache Iceberg); the in-scope service list moved +6 / −3 (Aurora, Amazon Q, Bedrock, Kendra, Data Exchange, S3 Tables added; Cloud9, CodeCommit, AWS SCT removed), DEA-C01 revisions page, 2025-12-12; in-scope/out-of-scope pages, accessed Oct 2026.
- Stale-fact warning: a 2024-era pipeline spec saying
GlueVersion=4.0, target "kinesis-firehose", and "12 months Free Tier" is wrong on all three counts today, the default is 5.1, the console name is Amazon Data Firehose (renamed 2024-02-09, APIs unchanged, and the DEA guide still prints "Amazon Kinesis Data Firehose"), and accounts created after 2025-07-15 get a 6-month Free Plan with up to $200 in credits, AWS Free Tier page, accessed Oct 2026. - Glue is now one leg of an open-table-format triangle: Glue 6.0 writes Apache Iceberg v3 (VARIANT + shredding, deletion vectors, row lineage), while Redshift gained Iceberg writes (GA 2025-11-17, tables registered in the Glue Data Catalog), JIT ANALYZE (2025-11-18), UPDATE/DELETE/MERGE on Iceberg including S3 Tables (2026-04-23) and Iceberg materialized views (2026-10-05), a Glue-authored Iceberg table can now be modified in place by Redshift, queried by Athena and shared through Lake Formation, AWS What's New, 2025-11-17 / 2026-04-23 / 2026-10-05; Glue 6.0 announcement, 2026-08-21.
- Not every streaming path needs a Glue job any more: Kinesis Data Streams can now deliver straight into Iceberg tables on Amazon S3 Tables (2026-08-28, source format converted to Parquet automatically, inline compaction, "no ETL") or into general-purpose S3 buckets (2026-08-29), both available only in the on-demand capacity modes and priced per GB delivered, AWS What's New, 2026-08-28 and 2026-08-29. Read that as a cost option to evaluate, not as "Glue is obsolete": scheduled, bookmark-driven, quality-checked lake writes are still the Glue pattern this exam tests.
- 📚 Did you know? The exam guide's own removals are as examinable as its additions: AWS SCT, Cloud9 and CodeCommit left the in-scope list at v1.1, which is why "use Schema Conversion Tool" is now a distractor where "use Glue or native tooling" is the answer, and S3 Tables arriving in-scope is why Glue writing Iceberg (including Iceberg v3 features on 6.0) is fair game (DEA-C01 in-scope services page, accessed Oct 2026).
- 📚 Did you know? The rename confusion runs both ways in this topic: the DEA in-scope list still prints "Amazon Kinesis Data Firehose" while the product has been Amazon Data Firehose since 2024-02-09, "no other changes, including service endpoints, APIs, the AWS Command Line Interface (AWS CLI), the AWS Identity and Access Management (IAM) access policies, and Amazon CloudWatch metrics" (AWS What's New, 2024-02-09). IAM actions are still
firehose:*, so either name is valid on the exam, never "correct" an option that uses the older one (AWS Firehose history page, accessed Oct 2026).
Real-World Case Studies
AWS publishes what these abstractions look like in production. Every figure below is customer- or AWS-claimed and unaudited, with the source named so you can check it: the examinable point is the pattern, not the marketing.
Case A, BMW Group: an on-premises lake becomes a governed cloud lake (Glue as the schema layer)
Element | Detail |
|---|---|
Customer | BMW Group, automotive manufacturer |
Challenge | An on-premises data lake built in 2015 could not serve multiple tenants |
Services | Producers: Amazon Data Firehose + AWS Lambda + AWS Glue + Amazon EMR; consumers: Amazon Athena, SageMaker AI, Amazon EMR; storage in Amazon S3, schemas in the AWS Glue Data Catalog |
Outcomes | 10 TB/day from 1.2 million vehicles; a Cloud Data Hub serving 500+ users; telemetry shared in anonymised form |
Exam domain | Domain 1 (transformation and catalog-driven processing) with Domain 4 hooks (multi-tenant cost attribution) |
Source | aws.amazon.com/solutions/case-studies/bmw-group-case-study (accessed Oct 2026) |
The examinable pattern is the separation AWS teaches: data lands in S3, schemas live in the Glue Data Catalog, transformation runs in Glue/EMR, and consumption (Athena, SageMaker) reads the same catalog. Producers and consumers are different accounts with different privileges; which is why the catalog, not the bucket, is the contract.
Case B, PayU: Glue ETL into a shared warehouse (transformation feeding consolidation)
Element | Detail |
|---|---|
Customer | PayU, fintech/payments company |
Challenge | Data siloed across ~40 production databases; queries taking 10 to 15 minutes; freshness only once a day |
Services | AWS Glue ETL → Amazon S3 → Amazon Redshift, plus Redshift Data Sharing across 5 clusters (2 ETL + 3 consumer) |
Outcomes | Queries 10 to 15 min → under 1 min; freshness once/day → under 30 minutes (ML streaming under 5 s); $20,000/month saved; ~200 TB scanned per day; query volume 150,000 → 35,000 per month (−77%) |
Exam domain | Domain 1 (Glue features to process data) feeding Domain 3/4 (cost and performance) |
Source | aws.amazon.com/solutions/case-studies/payu-redshift-case-study (accessed Oct 2026) |
"In 1 month, we cut down queries by 77 percent, which would have been a 6-month exercise in the previous environment.": PayU, AWS case study (accessed Oct 2026)
Read PayU as two separate levers: the platform move (Glue → S3 → Redshift with data sharing) is an architecture change worth $20,000/month (customer-claimed), while the demand rationalisation is a 77% query reduction. Answers that collapse both into "AWS saved 77% on cost" are reading the number wrong.
Case C, Integral Ad Science: the catalog as the authorization plane (Glue Data Catalog + Lake Formation)
Element | Detail |
|---|---|
Customer | Integral Ad Science (IAS), ad-tech |
Challenge | A self-service data lake spanning producer and consumer accounts under GDPR/CCPA, with access granted by data classification and job role rather than by hand-written per-bucket policies |
Services | AWS Lake Formation grants and tag-based access control (LF-TBAC), AWS Glue Data Catalog, Amazon Athena, Amazon EMR, Okta federation; S3 reachable only through a Lake Formation data access role |
Outcomes | Hundreds of permission rules reduced to exactly two; column-level control; database-level tags inherited by tables and columns; Athena workgroups per business unit double as billing tags + query limits |
Exam domain | Domain 1 (catalog-driven processing) with Domain 4 (governed, self-service access) |
Source | aws.amazon.com/blogs/big-data/integral-ad-science-secures-self-service-data-lake-using-aws-lake-formation (2021-09-23, accessed Oct 2026) |
"With Lake Formation tag-based access controls, IAS reduced hundreds of permission rules down to precisely two rules.": AWS Big Data Blog (accessed Oct 2026)
Read IAS as the same catalog this lesson describes (§1.4) wearing a second hat: the Glue Data Catalog holds the schema, and Lake Formation decides who may read which table, column or row of that schema. That is why "just add an S3 bucket policy" is the wrong instinct in an exam answer about a governed, multi-account lake, and why tags, not principals, are the scaling mechanism.
Case D, Nasdaq: an exchange batch load decoupled from query (S3 as the landing zone)
Element | Detail |
|---|---|
Customer | Nasdaq, stock exchange |
Challenge | An overnight batch load of orders, quotes and trades that must finish before the market opens, still running on a legacy on-premises warehouse after the 2014 move to AWS |
Services | Amazon S3 data lake (write path) + Amazon Redshift with Redshift Spectrum (read path) = a lake house, plus S3 Glacier and S3 Object Lock for archive and retention |
Outcomes | 70 billion records/day processed (peak 113 billion, Feb 2020), up from 30 billion; 90% of the load completed 5 hours sooner; queries 32% faster; a 15 TB lake queried in place |
Exam domain | Domain 1 (batch load and transformation cadence) with Domain 2 (decoupled storage and compute) |
Source | aws.amazon.com/solutions/case-studies/nasdaq-case-study (accessed Oct 2026) |
"We were able to easily support the jump from 30 billion records to 70 billion records a day because of the flexibility and scalability of Amazon S3 and Amazon Redshift.": Robert Hunt, VP Software Engineering, Nasdaq (AWS case study, accessed Oct 2026)
The examinable pattern is contention removed: loading writes to S3 while querying reads Redshift/Spectrum over the same storage, so the nightly deadline stops being a shared-capacity argument. It is the same architectural instinct as PayU's Glue → S3 → Redshift path, land once in the lake, transform with Glue, let each consumer read cheaply, and the reason partitioned, catalogued output (§9.2) matters more than raw throughput.
Case | Glue/DataBrew pattern it demonstrates | Domain |
|---|---|---|
BMW Group | Catalog as the schema contract between producer and consumer accounts | D1 Transformation |
PayU | Glue ETL as the load path into a consolidated, shared warehouse | D1 → D3/D4 |
Integral Ad Science | Glue Data Catalog metadata governed by Lake Formation tag-based access control | D1 → D4 |
Nasdaq | Decoupled S3 landing zone feeding a nightly batch transformation and query path | D1 → D2 |
- 📚 Did you know? Neither case study mentions a code-free tool as the load path: both put Glue in the pipeline and kept humans out of the loop for the scheduled work. That is the shape of the exam's answer too: DataBrew for preparation and profiling, Glue for the scheduled, governed, incremental run (AWS case studies, accessed Oct 2026).
- 📚 Did you know? Nasdaq's own words describe a load deadline, not a query one: 90% of the daily load finished 5 hours sooner after moving to S3 + Redshift, and the 15 TB lake is queried where it sits instead of being copied: with S3 Object Lock holding the retention side of the exchange's compliance story (AWS Nasdaq case study, accessed Oct 2026). Numbers are AWS/customer-published and specific to Nasdaq's workload; do not generalise them into a universal "32% faster" claim.
Practice Questions
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue DynamicFrame reports a column as choice<long,string> because the crawler sampled only a 2 MB prefix while later files contain string values. Which resolveChoice action keeps only the long-typed values and discards the string ones?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue streaming job reading from Kinesis must avoid reprocessing records after a restart. Which mechanism is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Job 1 was started manually from the console, finished with SUCCEEDED, but the conditional trigger that should start Job 2 never fired. Why?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Data Catalog crawler runs hourly, uses 2 DPU, and finishes actual work in 3 minutes. At $0.44 per DPU-hour with a 10-minute minimum per run (as of Oct 2026), what does it cost for a 30-day month?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
An analyst designs a DataBrew recipe with 140 transformations. What happens?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue job on G.2X workers fails repeatedly with out-of-memory errors during a wide join. Sizing DPU is not the issue: the team must stay at 16 DPU. What is the correct change?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A nightly job copies one small file in about 90 seconds, runs on a loose SLA, needs no shuffling and no Spark. Which option is the most cost-appropriate?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A job is created without specifying GlueVersion and with a blank Timeout. As of October 2026, which statement is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
In a scripted Glue ETL job, what is the correct order of operations when the source contains a genuine choice type and you need renamed, cast, nested columns before writing?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A business analyst wants to explore, cleanse and profile a new S3 dataset with point-and-click steps and column statistics, then schedule the prepared output for a Glue catalog table. What is the best-fit combination?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue 6.0 Spark job runs 6 DPU for 15 minutes. At $0.308 per DPU-hour (us-east-1, as of Oct 2026), what is the cost per run, and how does it compare with the same job on Glue 5.1 at $0.44?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Which statement about job bookmark state is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue ETL job pinned to GlueVersion=6.0 fails during startup with NoClassDefFoundError for com.amazonaws.services.s3.AmazonS3Client, and the log also reports that fs.s3.consistent.* is not a recognised filesystem setting. What is the correct remediation?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A data lake spans producer and consumer accounts and access must be granted by data classification and job role. An AWS-published customer case study cut hundreds of per-principal permission rules down to exactly two. Which pattern did it use?
⚠️ Exam-day traps for this lesson:
- DynamicFrame first:
resolveChoice→apply_mapping→toDF(); a choice column converted early silently becomesstring. castvsproject: cast makes uncastable valuesnull; project drops the other type's values.- Bookmarks are batch: streaming needs
checkpointLocation+ watermarks; there is no bookmark rewind, and reset touches all transformations while cleaning no outputs. transformation_ctxis the state key: change the source path without changing it and files go missing; bookmarks are not concurrency-safe (MaxConcurrentRunsdefault 1).- Conditional triggers need a trigger-started chain from a single scheduled/on-demand root: a manually started job will never fire one; max 2 crawlers / 50 jobs per trigger.
- G workers keep 4 vCPU: 16 GB: only R. doubles memory per DPU; G.4X will not fix an OOM.
MaxCapacityis legacy: Glue ≥2.0 usesWorkerType+NumberOfWorkers, never both.- Crawlers bill a 10-minute minimum; DataBrew does not bill DPU-hours ($0.48/node-hour, $1.00/30-min session), and its recipe caps at 100 steps, schedules at 5-minute intervals.
- Timeout defaults are version-dependent: 2,880 min (≤4.0) vs 480 min (≥5.0), always < 10,080 min.
- DataBrew has six objects and no "data flow"; Glue has no "ErrorCDC": the documented names are
ErrorsAsDynamicFrame,SpigotandEvaluateDataQuality. - Security configuration overrides encryption passed as a job parameter; bookmarks use CSE-KMS, S3/CloudWatch use SSE-KMS, and Ray jobs have no security configuration.
- The 30% Glue 6.0 cut only applies on 6.0; 5.1 is the default, and crawlers/Python shell/Ray show no separate 6.0 rate.
- On Glue 6.0, EMRFS and AWS SDK for Java v1 are gone: any
fs.s3.consistent.*setting orcom.amazonaws.*import is stale (S3A + SDK v2 only, boto3 unaffected), and the Scala binary is 2.13, not 2.12. - Governed lakes authorize through Lake Formation, not bucket policies: the AWS-published IAS pattern cut hundreds of permission rules to exactly two with tag-based access control on the Glue Data Catalog.
Comparative Verdict: how this topic compares on exam day
- Versus another cloud: this exam tests AWS services only: nothing in DEA-C01 asks you to compare Glue with a competitor's hosted Spark. Answer with an AWS service or an AWS-documented behaviour (DPU, quotas, trigger rules); an option that pivots to an unverified third-party benchmark is out of scope by construction.
- Versus self-managed / on-premises (your own EMR or Hadoop): Glue removes cluster provisioning, patching and idle capacity, you pay per second while the job runs ($0.44/DPU-h ≤5.1, $0.308/DPU-h on 6.0, as of Oct 2026) with a 1-minute minimum. The counter-case the exam respects: self-managed EMR remains defensible when you need fine-grained cluster control or a runtime Glue does not offer, the answer must fit the stated requirement, not a slogan.
- Versus another AWS service: Lambda wins for sub-15-minute event micro-transforms (GB-second metering, no DPU floor); Glue pythonshell for >15-minute single-process Python at 0.0625 DPU; Glue Spark for distributed GB: TB joins and partitioned lake writes; DataBrew for code-free preparation, cleansing and profiling; Amazon EMR when you need full Spark/Hive/Presto cluster control. Wrong answers almost always size the engine to habit instead of to volume, latency and who writes the logic.
- Versus a manual, human process: DataBrew exists because preparation is often analyst work, but scheduled, incremental, governed production runs belong to Glue with bookmarks, triggers, error tables and job insights. Choose the option with the least unmanaged manual effort: hand-edited CSVs and ad-hoc scripts are distractors, not bonus points.
Key Takeaways:
- Glue is serverless and billed per second while running (1-second increments, 1-minute minimum for Spark jobs); a job is command + worker type/count + IAM role + connections + security configuration + triggers + timeout + retries +
MaxConcurrentRuns(default 1), and run history lasts 90 days. - Job types are
glueetl(Spark),gluestreaming,pythonshell(0.0625 or 1 DPU) and RayZ.2X; authoring happens through PySpark/Scala, Python, Glue Studio or notebooks (Pandas, SQL). - DynamicFrame records are self-describing and can carry a real
choicetype; DataFrame requires a resolved schema. Order isresolveChoice→apply_mapping→toDF()→ write, withcast(→ null),project(→ drop),make_cols,make_structandMATCH_CATALOGas the four resolution actions. - Job bookmarks = Enable / Disable (default) / Pause; state is keyed by
job_name+ version withtransformation_ctxas the per-source key;job.initreads,job.commitwrites; only sources are tracked, no rewind, reset clears all transformations and no outputs, and streaming usescheckpointLocation+ watermarks instead. - Triggers:
SCHEDULED(cron),CONDITIONAL(predicate AND/OR over watched jobs and crawlers),ON_DEMAND,EVENT(EventBridge); conditional chains must be trigger-started from a single root, with max 2 crawlers / 50 jobs per trigger. - 1 DPU = 4 vCPU + 16 GB; default Spark 10 DPU, streaming 2 DPU, minimum 2 DPU; G workers keep the 4:16 ratio while R workers double memory (4 vCPU : 32 GB); G.4X/G.8X need ≥3.0, G.12X/G.16X ≥4.0, G.025X streaming-only, Z.2X Ray-only.
- Pricing (us-east-1, as of Oct 2026): Spark $0.44/DPU-h (≤5.1) vs $0.308/DPU-h (6.0) · Flex $0.29 · R workers $0.52 · crawler $0.44 with a 10-minute minimum · DataBrew jobs $0.48/node-hour (5-node default) and sessions $1.00/30 min · Data Catalog free to 1M objects and 1M requests/month.
- Worked math to remember: 6 DPU × 15 min = $0.66 (≤5.1) / $0.462 (6.0) · Flex 6 DPU × 1/3 h = $0.58 vs $0.88 · 16 DPU as 16×G.1X or 2×G.8X = $7.04/h either way · hourly 2-DPU crawler = $105.60/month at the 10-minute minimum vs $31.68 at true duration · DataBrew 5 nodes × 10 min = $0.40.
- Glue Studio generates real PySpark from a node graph; the Data Preparation Recipe node imports DataBrew recipes on Glue ≥4.0 but not
GROUP_BY/PIVOT/UNPIVOT/TRANSPOSE, and rejects recipes containingUNION/JOIN; preview sessions are 2 DPU / 30 minutes, auto-stopping. - DataBrew's six objects are project, dataset, recipe, job (recipe or profile), data lineage and data profile: no "data flow"; recipes cap at 100 steps / 100 published versions, schedules cannot be faster than 5 minutes, and account quotas include 300 nodes and 10 concurrent jobs.
- Failure design: route rejects with
ErrorsAsDynamicFrame/errorsFromDF, sample withSpigot, enforce rules withEvaluateDataQuality, configureMaxRetries/NotifyDelayAfter, set an explicit timeout (defaults 2,880 vs 480 minutes by version, ceiling <10,080), and turn on job run insights (--enable-job-insights=true) for the failing line, last Spark action and root cause. - Performance comes from partitioned writes with
partitionKeys, input grouping beyond ~50,000 files,coalesce/repartitionfor output counts, auto scaling (--enable-auto-scaling=true,NumberOfWorkers= max, Glue ≥3.0) and picking the right meter: plus the 2026 state: Glue 6.0 GA 2026-08-21 at −30%, 5.1 the default, 0.9/1.0/2.0 EOL 2026-04-01, and exam guide v1.1 (2025-12-12) with +8 skills and in-scope +6/−3.