Data Modeling, Glue Catalog and Schema Evolution
Build the metadata layer Domain 2 is really about: the AWS Glue Data Catalog object model (catalog, database, table, partitions, versions), how crawlers and ordered custom classifiers infer schema, how partition indexes, partition pruning and Athena partition projection differ, how table versioning plus blue/green swaps let a schema change without breaking consumers, and how resource links and Lake Formation share one catalog across accounts, then the modeling half: star versus snowflake schemas, grain, facts and dimensions, surrogate keys, SCD Type 1 versus Type 2 with a worked merge, Redshift denormalization and distribution keys, additive versus breaking schema changes with Hive-style and Iceberg tables, DynamoDB single-table access-pattern design, and the partitioning/bucketing/sorting/compression ladder, with a sourced October 2026 update box, three AWS customer case studies and fourteen exam-style questions.
Two DEA-C01 Domain 2 tasks meet in this lesson. Task 2.2, understand data cataloging systems, asks you to build and reference a technical data catalog (AWS Glue Data Catalog, Apache Hive metastore), discover schemas with crawlers, synchronize partitions and create source/target connections. Task 2.4, design data models and schema evolution, asks you to design schemas for Amazon Redshift, DynamoDB and Lake Formation, address changes to the characteristics of data, and describe best practices for indexing, partitioning strategies and compression. The exam treats them as one story: a model is only as good as the catalog that describes it, and a catalog is only safe if you can change what it describes without breaking every consumer.
====================================================================
DEA-C01 DOMAIN 2 - TASKS 2.2 (CATALOGING) + 2.4 (MODELS & SCHEMA)
====================================================================
Catalog ...... account/Region -> catalog -> database -> table
-> partitions (metadata ONLY, holds no data)
Discover ..... crawler -> ordered custom classifiers -> built-ins
-> infer -> write metadata (+ partition indexes)
Sync ......... scheduled/event crawler | MSCK REPAIR (max 100/stmt)
| BatchCreatePartition | Glue ETL updateCatalog
| Athena partition projection (no metadata at all)
Speed up ..... partition index (max 3/table) -> pruning -> projection
Versioning ... UpdateTable archives first -> VersionId + 1
100,000 versions/table, 1,000,000/account (Oct 2026)
Swap ........ an assembled PATTERN: catalog view / resource link /
publish-a-new-version - not a named Glue feature
Share ........ resource link = DESCRIBE on link + grant on target,
cross-account via Lake Formation or legacy IAM
Model ........ star | snowflake; decide GRAIN first; load dims first
History ...... SCD 1 overwrite | SCD 2 new row (start/end/flag)
Evolve ....... additive vs breaking; Hive static vs Iceberg metadata
NoSQL ........ DynamoDB single table: access patterns -> PK/SK -> GSI
Optimize ..... compress -> columnar -> sort stats -> buckets ->
partitions: each layer removes roughly an order
====================================================================In this lesson you will:
- read the Glue Data Catalog object model, catalog, database, table,
StorageDescriptor,PartitionKeys,classification, and the quotas that shape it; - run a crawler in your head: custom classifiers in order, first success wins, built-ins only if none matched, folder heuristics and
SchemaChangePolicy; - separate partition indexing, pruning and partition projection, including the two settings Athena needs to use an index;
- operate table versioning: what
UpdateTablearchives, how you compare two versions, and how a blue/green table swap is assembled from verified building blocks; - wire resource links for cross-account and cross-Region sharing, with the two-grant rule;
- choose star versus snowflake, set the grain, identify facts, dimensions and surrogate keys, and denormalize for Redshift distribution;
- implement SCD Type 1 versus Type 2 (and why Type 2 is the exam staple) with a worked merge;
- classify a proposed schema change as additive or breaking across Hive-style, Parquet/JSON/Avro and Iceberg tables, including partition evolution;
- design a DynamoDB single-table model from access patterns, keys and GSIs;
- stack partitioning, bucketing, sorting, compression and file size into one scan-elimination ladder;
- study three AWS customer case studies (BMW Group, GoDaddy and Integral Ad Science) and a sourced October 2026 update box;
- practise with 14 exam-style questions plus four interactive checks.
1. The Glue Data Catalog object model
1.1 The tree, and the one sentence that matters
The Data Catalog is a hierarchy of metadata: account/Region β catalog β database β table β partitions, plus functions. AWS's crawler documentation states the fact every catalog question is built on: "The tables in the Data Catalog do not contain data." A table row points at data (S3 Location, InputFormat, OutputFormat, SerdeInfo); it never holds it. That is why deleting a catalog table does not delete the objects, and why two catalogs can point at the same prefixes.
catalog (default, or a Redshift-federated catalog)
βββ database (max 10,000 per account)
βββ table ββ StorageDescriptor: columns, Location, InputFormat,
β OutputFormat, SerdeInfo, Compressed,
β BucketColumns, SortColumns, SkewedInfo
β ββ PartitionKeys: the Hive-style key order
β ββ TableType: EXTERNAL_TABLE | GOVERNED
β ββ Parameters: classification=parquet, etc.
β ββ TargetTable: pointer if it is a resource link
β ββ SchemaReference: pointer into Schema Registry
β ββ IsRegisteredWithLakeFormation
βββ partitions (one per key combination; 10,000,000 per table)One metadata layer feeds Athena, Redshift Spectrum, EMR, Glue ETL and SageMaker AI; which is the whole point: crawl once, query from several engines. Catalogs can also be federated, so a Redshift-federated catalog (or a catalog holding resource links to Redshift databases in another account or Region) appears in the same tree.
1.2 The quotas table (as of October 2026)
Object | Quota | Why you care |
|---|---|---|
Databases per account | 10,000 | One database per team is a common early design that dies here |
Tables per database / per account | 200,000 / 1,000,000 | Crawler mis-grouping burns this fast |
Partitions per table / per account | 10,000,000 / 20,000,000 | Athena still cannot read more than 1,000,000 in a single scan |
Table versions per table / per account | 100,000 / 1,000,000 | Ungoverned updates degrade reads |
Crawlers per account / concurrent | 1,000 / 150 | Concurrency, not count, is the real constraint |
Partition indexes per table | 3 | Plan the key subset, do not spray indexes |
Crawler S3 traversal depth | default 10, max 20 | Deep lake layouts silently stop crawling |
Data Catalog views | up to 10 base tables | The blue/green "stable name" primitive |
ALTER TABLE β¦ ADD PARTITION | 100 per statement | Why MSCK REPAIR exists |
Redshift external table columns (Glue) | 1,597 with pseudocolumns / 1,600 without | Wide catalog tables hit a wall |
- π Did you know? The Data Catalog itself has a free tier: the first 1,000,000 metadata objects and 2,000,000 metadata requests are free (AWS Glue pricing, accessed Oct 2026). Crawling and ETL are metered separately at $0.44 per DPU-hour, so a team can run a busy catalog for nothing and still get a surprise bill from its crawlers: the two lines on the bill answer different questions.
How to answer
Fill-in-the-blank exercise with 6 blanks. Type the missing words, then check your answer.
Complete the Data Catalog object-model statements using AWS's own wording:
The Glue Data Catalog tree runs account/Region -> blank -> blank -> blank -> blank. A table is metadata only: AWS's crawler documentation states that the tables in the Data Catalog do not contain blank - and the format label a classifier writes into a table's Parameters map is called blank, which is what Athena uses to decide how to read the files at the table's Location.
Word Bank, drag words into the blanks above:
2. Crawlers and classifiers: how a schema gets discovered
2.1 The run order: the single most-tested crawler fact
AWS documents a fixed pipeline: the crawler runs any custom classifiers that you choose⦠in the order that you specify, and "The first custom classifier to successfully recognize the structure of your data is used to create a schema. Custom classifiers lower in the list are skipped." Only if no custom classifier matches do the built-in classifiers try. Then the crawler connects, infers the schema and writes metadata.
Two consequences exam writers love. First, a classifier is a format/schema recognizer (it "checks whether a given file is in a format the crawler can handle" and emits a StructType); the crawler is the orchestrator that discovers, groups, versions and writes. Second, priority is positional: a CSV classifier with delimiter=; listed first beats a JSON classifier listed second, and everything below the winner is skipped.
2.2 Targets, schedule and recrawl
Setting | Options | Exam note |
|---|---|---|
Targets | S3Targets, JdbcTargets, DynamoDBTargets, MongoDBTargets, CatalogTargets, DeltaTargets, IcebergTargets, HudiTargets | Catalog-table sources cannot be mixed with other target types |
Schedule | cron string, e.g. cron(15 12 * * ? *) | Schedule is a cron expression, not an interval |
Recrawl | all sub-folders / new sub-folders only / based on events (S3 β SQS) | Event-driven is the cost answer |
S3Targets extras | Exclusions, SampleSize, ConnectionName, EventQueueArn, DlqEventQueueArn | One network connection per crawler, shared by all S3 targets |
Depth | default 10, max 20 | Iceberg/Hudi targets point at the metadata path |
IAM Role | read on the data and write on the catalog | The wizard mints AWSGlueServiceRole-<name> plus inline s3:GetObject |
2.3 SchemaChangePolicy, and how to freeze a curated schema
UpdateBehavior β {LOG, UPDATE_IN_DATABASE}; DeleteBehavior β {LOG, DELETE_FROM_DATABASE, DEPRECATE_IN_DATABASE (adds a DEPRECATED marker plus a timestamp)}. The critical trap: the policy "does not affect whether or how new tables and partitions are added."
β οΈ UpdateBehavior=LOG is not "freeze my schema." Setting it to LOG stops the crawler from updating existing tables, but brand-new tables and new partitions are still created. To freeze both, add UpdateBehavior=LOG plus the configuration {"CrawlerOutput":{"Partitions":{"AddOrUpdateBehavior":"InheritFromTable"}}}. An option claiming LOG alone stops all writes is testing whether you read the sentence above.
2.4 Worked example E1: a crawler that must not wreck three hand-curated columns
Input: s3://acme-raw/orders/dt=2026-10-0*/, semicolon-delimited CSV with quoted fields, timestamps currently inferred as string, three catalog columns hand-edited by an analyst that must survive every crawl.
1. Register a CUSTOM CSV classifier (delimiter ';', quote char) and
list it FIRST -> first success wins, built-ins skipped
2. Crawler source = existing CATALOG tables
-> partitions update, tables never recreated
3. UpdateBehavior = LOG + AddOrUpdateBehavior = InheritFromTable
-> schema and partition layout frozen
4. Schedule = cron(0 2 * * ? *) OR S3 event -> SQS event crawl
-> 10-minute billing minimum is avoided
5. Role = AWSGlueServiceRole + s3:GetObject/ListBucket on the prefix
6. Confirm CreatePartitionIndex = true (default for S3 targets)
and set partition_filtering.enabled = true for AthenaCost check as of Oct 2026: crawlers bill $0.44 per DPU-hour, per second, with a 10-minute minimum per crawl (1 DPU = 4 vCPU + 16 GB). A nightly crawl that runs two DPUs for the ten-minute minimum costs 2 Γ (10/60) Γ 0.44 β $0.15 per night β $4.5 per month, and that is before any idle queueing; which is why event-driven incremental crawls are the default recommendation for tables that change once a day.
- π Did you know? The folder heuristic is a majority vote, not a rule: "When the majority of schemas at a folder level are similar, the crawler creates partitions of a table instead of separate tables." So a folder of clean CSVs plus two malformed JSON files yields one table with partitions and the JSON noise is absorbed; while forcing genuinely different datasets apart means adding each root as a separate data store, not tweaking a flag (AWS Glue crawler documentation, accessed Oct 2026).
3. Synchronizing partitions: indexing, pruning and projection
3.1 Five mechanisms, one job
Mechanism | Where it runs | Ceiling / note |
|---|---|---|
Scheduled or event-driven crawler | Glue | Reads Hive-style key=value folders; can replace costly MSCK REPAIR |
MSCK REPAIR / ALTER TABLE ADD PARTITION | Athena/Spark SQL | Imperative; max 100 partitions per ALTER |
BatchCreatePartition API | your pipeline | Use when the pipeline already knows the new prefix |
Glue ETL writing the catalog | Glue job | enableUpdateCatalog=True + setCatalogInfo; partitionKeys must match catalog order; nested schemas unsupported |
Partition projection | Athena only | No partition metadata at all |
The partition schema exists at the table level and per partition, and Athena validates both: a mismatch fails fast with HIVE_PARTITION_SCHEMA_MISMATCH rather than silently misreading data.
3.2 Index versus pruning versus projection
- Pruning is the outcome: dropping non-matching partitions before any file is read. Athena prunes for every partitioned table, projected ones included.
- A partition index is a stored Data Catalog index over an ordered subset of partition keys, so
GetPartitionsfetches a subset instead of everything. Rules: max 3 per table; key types String/Numeric/Date; operators=,>,>=,<,<=,BETWEENand onlyAND(LIKE,IN,OR,NOTare ignored and applied afterwards); the index's first key must appear in the expression or the index is not used at all. - Projection is Athena computing partition values and locations in memory from table properties you configure on the Glue table: "Enabling partition projection on a table causes Athena to ignore any partition metadata registered to the table in the AWS Glue Data Catalog or Hive metastore."
3.3 Worked example E2: 400,000 partitions, one index, four queries
Index: [country, category, year] on a table with 400,000 partitions.
Query predicate | Index used? | Behaviour |
|---|---|---|
country='US' AND category='Shoes' AND year>2018 | Yes | Subset fetched; month filtered afterwards |
category='Shoes' alone | No | First key missing β load all 400,000 |
country='US' OR country='UK' | No | OR ignored β load all |
country='US' AND category IN ('Shoes','Bags') | Yes | IN ignored; index still used on country (+category), rest applied after |
category='Shoes' AND country='US' | Yes | The keys are present; the index still drives it, order of your ANDs does not matter |
Two settings, then two different consumers:
Partition index | Partition projection | |
|---|---|---|
Who creates it | Crawler by default for S3/Delta targets (not for encrypted partitions) | You, via table properties |
What Athena needs | index and partition_filtering.enabled=true | projection configured; stored metadata then ignored |
Who else uses it | Redshift Spectrum, EMR and Glue Spark DataFrames use an ACTIVE index without that flag | Athena only: Spectrum/EMR still read the catalog |
Cost of the design | Storage plus GetPartitions traffic | SHOW PARTITIONS stays empty; >50% empty projected partitions β revert |
- π Did you know? Glue ETL gives you two different pushdown knobs, and they prune in different places:
push_down_predicateis Spark SQL applied client-side after listing all partitions, whilecatalogPartitionPredicateis JSQL applied server-side through the partition index: the one to reach for when a table has millions of partitions (AWS Glue best practices, accessed Oct 2026).
4. Table versioning, compare and blue/green swaps
4.1 Versioning is always on
"By default, UpdateTable always creates an archived version of the table before updating it. However, if skipArchive is set to true, UpdateTable does not create the archived version." Every crawl that changes a schema therefore bumps VersionId by 1, against a ceiling of 100,000 versions per table and 1,000,000 per account (as of Oct 2026).
There is no true rollback: the current version cannot be deleted, and restoring means publishing a new version identical to the one you want back. (Apache Iceberg can roll back to a snapshot ID: a different feature, not a catalog version operation.)
4.2 Blue/green table swaps: a pattern, not a product
AWS ships no named "blue/green table deployment" feature for the Glue Data Catalog. What is verified are the building blocks, and the exam-safe way to answer is as an assembled pattern:
Building block | What it gives the swap |
|---|---|
CreateTable with TargetTable | A resource link can be re-pointed at _green |
Data Catalog views (up to 10 base tables; Athena/Redshift/Spark dialects) | A stable name consumers keep querying |
Version archiving + publish-new-version | Roll-forward "rollback" |
Athena CREATE OR REPLACE VIEW β¦ AS SELECT * FROM β¦_green | Switchover in one statement (third-party pattern) |
Blue/green guidance rule | Additive changes before code deploy, deletive changes after code deploy |
For RDS/Aurora blue/green deployments, DDL is not replicated: "Data definition language (DDL) changes aren't supported for blue/green deployments⦠switchover will be blocked." Same phrase, two layers: a Glue table swap is an assembled metadata pattern, while an RDS blue/green deployment is a managed feature with a hard DDL rule. Never answer "AWS Glue blue/green deployment" as though AWS ships it for catalogs.
5. Resource links and cross-account sharing
A resource link is a local table (or database) whose TargetTable is {CatalogId, DatabaseName, Name, Region}, so it can point across an account and across a Region. Creating one needs Lake Formation CREATE_TABLE/CREATE_DATABASE and IAM glue:CreateTable/glue:CreateDatabase.
The rules that generate questions:
-
"granting permissions on a resource link doesn't grant permissions on the target"; you need
DESCRIBEon the link plus a separate grant on the target. Two steps, always. -
Links render in italics in the console; there is no existence check at creation, so a link can point at nothing.
-
Chains are useless: APIs follow only the first resource link, so a link to a link does not resolve.
-
Two sharing stacks exist: Lake Formation (named-resource or tag-based access control, requiring the source account's resource policy to allow
glue:ShareResourceforram.amazonaws.com) or legacy IAM-only Glue permissions. Turning off "Use only IAM access control for new databases/tables" stops new objects being grantedSupertoIAMAllowedPrincipals. -
LF-Tags are key-value pairs such as
department=salesorclassification=restricted, and "Tables inherit LF-Tags from databases and columns inherit LF-Tags from tables"; which is how PII marking scales: grants count asn(principals) + n(resources)instead of a product. -
π Did you know? Nobody at GoDaddy typed those resource links in. Their mesh's provisioning pipeline used AWS Service Catalog and AWS Lambda to create the consumer-side links automatically, so a new data product showed up in a consumer account already linked and still exactly one grant away from being queryable. Automating the metadata object, not the data copy, is what keeps "hundreds of accounts" from becoming hundreds of manual tickets, and the two-step
DESCRIBE-plus-target rule still applied to every one of them (AWS Big Data Blog, accessed Oct 2026).
6. Dimensional modeling: grain, facts, dimensions, star versus snowflake
6.1 Grain first: the decision every other decision hangs from
Grain is what one row of a fact table means: "one row per order line", not "one row per order", not "one row per day per store". Decide it before you choose keys, because it determines which events can share a table and how big each row is. (AWS's Redshift modeling posts use grain throughout but never publish a formal definition: the exam wording is the industry/Kimball framing.)
Element | What it is | What it carries |
|---|---|---|
Fact table | The measurements of a business process | Additive measures + foreign keys to dimensions (and to surrogate keys) |
Dimension table | The context that "provide[s] the business meaning to the measures" | Descriptive attributes and hierarchies you group and filter by |
Grain | One row = one⦠| Set first; it fixes the keys |
Surrogate key | "Artificial keys⦠typically generated as a sequential integer, and they don't have any meaning in the business domain" | Small, immutable, collision-free across systems |
Load order | Dimensions before facts | "If the dimension load fails, the fact load will not run" |
Redshift builds surrogate keys with IDENTITY, and you should declare primary/foreign keys anyway: "Redshift will not enforce them, but declaring them will help the optimizer arrive at optimal query plans." Keep a date dimension: every fact table needs a date_sk.
6.2 Star versus snowflake
"Snowflake schemas extend the star concept by further normalizing the dimensions into multiple tables." AWS picks the star where it "closely align[s] with the business process", and columnar compression makes denormalized keys "relatively inexpensive to store", so the extra joins of a snowflake buy little and cost query time.
Read the two diagrams as a trade: the star joins the fact to four flat dimensions in four hops; the snowflake normalizes city β country and subcategory β category, so one hop becomes two and every extra join is work the engine must plan. On this exam, "the business process aligns with one fact and flat dimensions" β star; "the requirement is normalized, reusable conformed dimensions" β snowflake, with the join cost named.
6.3 Fact table shapes (awareness)
Type | One row means | Tell |
|---|---|---|
Transaction | One event (order, payment, click) | Largest, highest granularity |
Periodic snapshot | One set of dimensions at a fixed interval (end-of-day balance) | Repeatable and finite |
Accumulating snapshot | One row per long-running process, updated in place | Several milestone date keys; needs a current-plus-history strategy |
Factless | An event with no measure (attendance) | You count, you do not sum |
7. Slowly changing dimensions: Type 1 versus Type 2
7.1 The four types you are allowed to define
Type | Behaviour | Trade |
|---|---|---|
0: Fixed | The attribute never changes (date of birth) | No history needed |
1, No history | Overwrite the value; the dimension reflects the latest version | Cheap, loses audit, "no history is maintained" |
2: Maintain history | "All changes are recorded and versions are tracked with dates and flags" | Correct, and the exam staple |
3: Previous value | Keep the previous value in one extra column | Only one step back is knowable |
β οΈ A "Type 2" that updates the row is a Type 1. Type 2 requires a new row per change, with record_start_date, record_end_date (a high date such as 2999-12-31 for the current row), active_flag, an optional record hash over the tracked columns, and insert/update timestamps. Expire the old row and insert the new one in the same transaction. AWS's source defines Types 0 to 3 only; do not invent Types 4 to 7 in an answer.
How to answer
Matching exercise with 4 pairs. Match each item on the left with its answer on the right.
Match each slowly changing dimension type to the behaviour AWS documents for it:
Drag answers from here:
7.2 Worked example E3: a Type 2 merge, statement by statement
Stage holds the delta; the dimension holds history. Match on the business key with a left outer join, hash the tracked columns to decide update versus insert, and do it as bulk operations, never row-by-row cursors:
-- 1) expire the current row for every changed business key
UPDATE dim_customer
SET rec_exp_dt = CURRENT_DATE - 1,
is_active = 0
WHERE customer_id = :id
AND is_active = 1;
-- 2) insert the new active version in the same transaction
INSERT INTO dim_customer
(customer_sk, customer_id, city, rec_eff_dt, rec_exp_dt, is_active)
SELECT NEXTVAL('dim_customer_sk'), :id, :city,
CURRENT_DATE, DATE '2999-12-31', 1;Mechanics worth memorising:
-
Match detection: left outer join stage β dimension on the business key; matched rows are update/expire candidates, unmatched rows are inserts.
-
Change detection:
sha2across sources,FNV_HASH(64-bit) for large dimensions,CHECKSUM(32-bit) for small ones: a changed hash means the row must version. -
Delete detection: full extracts β compare previous and current versions; change-only extracts β use a status column.
-
Distribution: give stage and target matched distribution keys so the merge is node-local in Redshift.
-
Contract: load dimensions first, then facts: a failed dimension load must block the fact load.
-
π Did you know? The high-date convention
2999-12-31is not decoration: it lets a query find "every customer's current address" withWHERE is_active = 1or withWHERE CURRENT_DATE BETWEEN rec_eff_dt AND rec_exp_dt, and lets a historical fact join withf.order_date BETWEEN d.rec_eff_dt AND d.rec_exp_dt; which is exactly how a star schema answers "what did the order look like at the time". Type 1 has no equivalent because there is no interval to join on (AWS Redshift SCD guidance, accessed Oct 2026).
8. Denormalization and physical design in Redshift
The star schema's flat dimensions are a denormalization decision, and Redshift rewards it physically:
Lever | Rule from AWS guidance |
|---|---|
Fact DISTKEY | "Choose the foreign key for the largest frequently joined dimension as a distribution key in the fact table and the primary key in the dimension table", so the join is slice-collocated and needs no redistribution |
Small/mid dimensions | DISTSTYLE ALL (replicated, avoids a shuffle) |
Frequently updated dimensions | Prefer DISTSTYLE KEY |
Sorting | SORTKEY (compound or interleaved) so row-group min/max stats skip blocks |
Keys | Declare PK/FK anyway: unenforced, but the optimizer uses them |
After loads | ANALYZE (and VACUUM where applicable) |
Worked example E4 - picking the distribution key by size, not by habit
Fact table fact_order_lines 4,200,000,000 rows
Dimension A dim_customer 48,000,000 rows <- largest joined dim
Dimension B dim_product 180,000 rows
Dimension C dim_date 3,650 rows
Rule: fact.DISTKEY = customer_sk (largest frequently joined FK)
dim_customer.DISTSTYLE = KEY(customer_sk) <- matches the fact
dim_product / dim_date = DISTSTYLE ALL <- small enough to copy
Why: a join on customer_sk then happens inside each slice, with no
redistribution step, while the two tiny dimensions are already present
on every node. Sorting fact_order_lines on date_sk additionally lets
the engine skip whole row groups for a date-range filter.Denormalization also answers the snowflake question physically: extra normalized tables mean extra joins, and in a columnar warehouse those joins cost far more than the disk they save.
9. Schema evolution: additive versus breaking
9.1 The audit table
A change is additive when old readers and old files keep working; it is breaking when a consumer fails, silently coerces, or the partition layout no longer matches the query.
Proposed change | Hive-style external (Athena/Glue) | Iceberg |
|---|---|---|
ADD COLUMN channel string (append, nullable) | Safe; old files read NULL | Safe; metadata-only, new field ID |
Rename cust β customer | Catalog-only; readers keyed by the old name break | Safe: the field ID is stable |
Drop legacy_ref | Breaks SELECT *; a re-crawl can shift positions | Safe, no side effects |
Narrow/retype DECIMAL(12,2) β DECIMAL(9,2) | May fail or silently coerce | Only widening promotions allowed ( intβlong, floatβdouble, decimal precision up) |
Reorder / mid-table insert | Can raise HIVE_PARTITION_SCHEMA_MISMATCH | Safe |
New partition key | Rewrite object keys under new prefixes | New spec; old files keep their layout (split planning) |
Nested struct/array/map change | Glue ETL catalog update unsupported for nested | Add/drop/rename/reorder inside a struct supported |
Two anchors: "Iceberg schema updates are metadata-only changes. No data files are changed when you perform a schema update", and Iceberg correctness rests on unique field IDs: "Added columns never read existing values from another column". Athena, by contrast, fails fast rather than misreading: a partition schema that diverges from the table schema raises HIVE_PARTITION_SCHEMA_MISMATCH.
9.2 Partition evolution is the trap inside the trap
"Hive table partitioning cannot change so moving from a daily partition layout to an hourly partition layout requires a new table. And because queries are dependent on partitions, queries must be rewritten for the new table." For Iceberg: "When you evolve a partition spec, the old data written with an earlier spec remains unchanged. New data is written using the new spec in a new layout⦠Partition evolution is a metadata operation and does not eagerly rewrite files." Both statements are examinable, and they point in opposite directions: Hive-style partition keys are the S3 object keys, so changing the scheme is a migration; Iceberg partition specs are metadata, so old and new layouts coexist: at the cost of extra split planning.
9.3 How Parquet, JSON and Avro each handle the change
Format | Where the schema lives | Evolution behaviour (exam framing) |
|---|---|---|
Parquet | In each file's footer, columnar | Append a nullable column and old files still read (NULL); readers read only the columns they name, so an added column costs nothing to old queries. Default codec is Snappy |
JSON | No enforced schema: schema applied at read time | The classic schema-on-read payload: the crawler infers a schema, and "if this column is changed to a string by the source, without notifying the consumer, the pipeline will certainly fail" |
Avro | Embedded writer schema, field IDs | Schema travels with the data; compatibility is decided by rules, which is why the Glue Schema Registry (streaming, serverless and free, 8 compatibility modes, default/recommended BACKWARD) validates records at serialisation time |
ORC | In-file, columnar with built-in indexes | Default codec ZLIB; usually smaller files than Parquet |
Scope call: the exam guide's in-scope list says "AWS Glue" and never names the Glue Schema Registry, and no skill bullet names it either. Learn it as awareness for streaming schemas, SchemaArn and version numbers, and never as the answer to a question about a Data Catalog table version (Table.VersionId). A table may reference a registry schema through StorageDescriptor.SchemaReference, but registry compatibility is not a catalog version bump.
9.4 Worked example E5: classify five requests before you ship them
Request 1 ADD COLUMN channel (append, nullable) -> ADDITIVE
ship BEFORE the consumer deploy; old files read NULL
Request 2 DROP COLUMN legacy_ref -> BREAKING
ship AFTER the consumer deploy (additive first,
deletive after code deploy)
Request 3 RETYPE amount DECIMAL(12,2) -> DECIMAL(9,2)-> BREAKING
narrowing is not a widening promotion; Hive may coerce
Request 4 hourly partitions instead of daily -> BREAKING (Hive)
new table + rewritten queries; METADATA-ONLY on Iceberg
Request 5 RENAME cust -> customer -> BREAKING (Hive)
safe on Iceberg (field ID stable); consumers keyed by
the old column name still break in both worldsThe ordering rule, additive before code deploy, deletive after code deploy, is the single most reusable sentence in this section.
10. DynamoDB single-table design: access patterns first
"Single table design is a pattern that allows you to store multiple types (entities) of data in a single DynamoDB table." The AWS-documented workflow runs use case β entity-relationship β access patterns (written as SQL) β schema β PK/SK per table and GSI β repeat, and it starts from queries, not entities.
Concept | What it does |
|---|---|
Access pattern | A sentence like "get an order by id" or "list a customer's orders newest-first": the input to the design |
Partition key | The equality condition; must be high-cardinality so items spread evenly |
Sort key | Range / begins_with: gives one-to-many, hierarchy and ordered collections |
Composite prefixes | ORDER#123, INVOICE#123 separate entity types in one table (item collections sharing a partition key) |
Generic names | Overloaded tables use PK/SK rather than entity-specific names |
GSI | A shadow table with its own PK/SK, independent throughput, async eventually-consistent sync, projections KEYS_ONLY / INCLUDE / ALL |
Sparse index | Only items carrying the GSI key are indexed: an optional flag costs nothing for items without it |
Index overloading | One GSI serves many entity types |
Write sharding | Append rand(0,N) when a single partition key would exceed 3,000 RCU/s or 1,000 WCU/s |
Multi-attribute keys | Up to 4 PK + 4 SK = 8 attributes; all PK attributes need equality; SK attributes are queryable left-to-right without skipping |
Vertical partitioning | Split a large document into items sharing a PK with SK prefixes: beats the 400 KB item limit and keeps writes small (writes bill in 1 KB steps) |
10.1 Worked example E6: four access patterns to a design
Patterns: (a) get customer by id
(b) list a customer's orders, newest first
(c) get one order by order id
(d) list escalated faults
Base table PK = customerId, SK = ROOT -> (a)
item PK = customerId, SK = ORDER#<iso8601> -> (b)
query with ScanIndexForward = false (newest first)
GSI1 PK = orderId, SK = ROOT -> (c)
SPARSE: only order items carry orderId, so
index cost is proportional to orders, not items
GSI2 PK = escalatedTo, SK = ... -> (d)
SPARSE: present only on fault items
Ceiling check (as of Oct 2026): a partition key caps at 3,000 RCU/s
and 1,000 WCU/s -> if orderId would exceed that, shard it as
orderId#<0..N> and query all N partitions in parallel.
Item ceiling: 400 KB; a 900 KB order document MUST be split into
items sharing PK = ORDER#123 with SK prefixes (HEADER#, LINE#n).Choose single-table when the entities are queried together with similar operational needs; choose multiple tables when retention, backup, per-tenant KMS keys or table class needs diverge. AWS states both sides; this is a judgement question, not a "single table is always better" question.
11. Partitioning, bucketing, sorting, compression: the elimination ladder
Each layer removes work before the next layer runs, outermost first:
# | Layer | What it eliminates | Ceiling / default (Oct 2026) |
|---|---|---|---|
1 | Partitioning (date, region) | Whole directories/prefixes | Athena reads at most 1,000,000 partitions in one scan; too-fine partitions inflate GetPartitions |
2 | Bucketing / clustering | Hash buckets inside a partition | Glue fields NumberOfBuckets / BucketColumns; Iceberg bucket(N, col) |
3 | Sorting | Row groups/stripes, via min/max stats | "data within the files are sorted⦠Athena can use the minimum and maximum values in the file metadata to skip the unneeded parts" |
4 | Columnar format | Untouched columns | Parquet for wide/complex query mixes; ORC for complex types and built-in indexes |
5 | Compression | Bytes before decompression | "Querying compressed data is faster and also cheaper because you pay for the number of bytes scanned before decompression." |
6 | File size | Listing/request overhead | Glue auto-enables file grouping above 50,000 input files; Parquet row groups 128 MB, ORC stripes 64 MB (stripes under 8 MB are read whole) |
Codec choice (from the AWS Glue best-practices codec table): Snappy: fast, moderate ratio, default for Parquet; GZIP: high ratio, CPU-intensive and not splittable, so cold/archival text only; Bzip2: very high ratio, splittable, slow; ZLIB: default for ORC; Zstd: balanced. Compression vs parallelism is a real trade: Gzip on hot text loses splittability.
11.1 Worked example E7: the scan-cost ladder
100-column, 4 TB uncompressed CSV, a query selecting one column for one day of 365:
Raw CSV, full scan 4,000,000 MB (baseline)
+ GZIP at 4:1 1,000,000 MB -> ~1 TB
+ Parquet, 1 of 100 columns 10,000 MB -> ~10 GB
+ partition pruning, 1 of 365 ~28 MB
+ sort min/max skipping fewer row groups read
Each step removes roughly an order of magnitude, and the layers
compound: compression shrinks the scan, columnar skips columns,
sort stats skip row groups, buckets skip buckets, partitions skip
directories.Athena prices the result: at $5.00 per TB scanned with a 10 MB minimum per query (Athena pricing, accessed Oct 2026), the raw scan is about $20.00, the GZIP scan $5.00, the Parquet single-column scan $0.05, and the partitioned scan is measured in fractions of a cent. Format and layout are cost controls, not merely performance controls.
How to answer
Ordering exercise with 6 items. Move them into the correct order, then check your answer.
Order the data-optimization ladder from the outermost elimination layer (removes the most work first) to the innermost:
- π Did you know? Sorting helps only filters on the sort column: the min/max stats describe the sort key, so a predicate on any other column skips nothing. That is why "add a SORTKEY on
customer_id" answers a customer-filtered query and does nothing for a product-filtered one (AWS Athena performance guidance, accessed Oct 2026).
The other half of an Athena bill is the reservation minimum rather than the bytes scanned, and that minimum itself moved in 2026. Take the same nightly batch window, 12 DPU running for 10 minutes, and read it in DPU-hours (DPU Γ hours) under the old rule and the new one:
Reading the chart: the work never changed, 12 DPU for 10 minutes either way, but the billable quantity fell from 24 Γ 1 = 24 DPU-hours to 12 Γ (10/60) = 2 DPU-hours, a 12Γ cut produced purely by lowering the service minimum from 24 DPU / 60 minutes to 4 DPU / 1 minute (AWS Big Data Blog, 11 Feb 2026, accessed Oct 2026). Layout still decides how many bytes you scan; the reservation rule decides how many of those minutes you are forced to buy.
2026 Updates (as of October 2026)
What moved in this topic between the launch-era guide and the guide you download today: each line checked against a primary AWS source in October 2026:
- Exam guide v1.1 (12 December 2025) consolidated knowledge/skills into one skill list and added 8 skills, removing none. For this lesson: 2.1.7 "Manage open table formats (for example Apache Iceberg)" makes Iceberg schema and partition evolution directly testable; 2.2.6 "Create and manage business data catalogs (for example Amazon SageMaker Catalog)" is a new cataloging skill; 2.4.6 adds vectorization concepts. In-scope +6 / β3: Amazon S3 Tables added, AWS SCT removed, so Task 2.4.3's schema-conversion skill now reads AWS DMS Schema Conversion, with SCT as legacy vocabulary only (exam guide revisions page, accessed Oct 2026).
- AWS Glue 6.0 (21 August 2026): 30% lower price, Spark 4.1.1, Python 3.13, Hudi 1.1.1, Iceberg 1.11.0, Delta 4.2.0 and Iceberg format v3 (deletion vectors, row lineage). Breaking changes for jobs: EMRFS removed (S3A is the only S3 filesystem) and AWS SDK for Java v1 removed: an option still referencing
fs.s3.consistent.*orcom.amazonaws.services.*is stale (AWS Glue 6.0 announcement and migration page, 21 Aug 2026 / accessed Oct 2026). - Glue version hygiene: Glue 0.9/1.0/2.0 reached end of life on 1 April 2026, and Python Shell 3.6 cannot create new jobs after 31 March 2026 (existing jobs still run). Glue 5.1 has been the default for new jobs since 26 November 2025 (AWS Glue version support policy, accessed Oct 2026).
- Lake Formation cross-account sharing v5 (11 February 2026): a single AWS RAM share can now carry unlimited tables (AWS says "hundreds of thousands"), new grants use wildcard patterns instead of per-resource associations, existing shares keep working, and the upgrade is opt-in: the resource-link-plus-target-grant rule in Section 5 is unchanged (AWS What's New, 11 Feb 2026).
- Iceberg is now written from Redshift: Iceberg writes GA 17 November 2025 (registered in the Glue Data Catalog), UPDATE/DELETE/MERGE 23 April 2026, materialized views 5 October 2026, and Iceberg DELETE on Lake Formation tables requires the DELETE permission, with all Iceberg DML needing ALTER. Any option claiming Redshift can only read lake tables is stale (AWS What's New and Redshift behavior-changes page, accessed Oct 2026).
- The catalog side of Athena moved too: Glue Data Catalog materialized views (30 November 2025), statistics-driven cost-based optimization for Iceberg that works with Lake Formation row filters and column masks (21 November 2025), managed query results that need no S3 result bucket and cost nothing extra (3 June 2025), managed connectors for 12 sources (23 April 2026), and a Capacity Reservation floor cut from 24 DPU / 60 minutes to 4 DPU / 1 minute (11 February 2026): an option requiring a mandatory result bucket, or billing a full hour for a ten-minute batch, is stale (AWS Athena release notes and AWS What's New, accessed Oct 2026).
- Iceberg schema machinery went to v3: Amazon S3 Tables is now in scope (guide v1.1) and shipped the Variant type for Iceberg format v3 on 28 July 2026; Glue 6.0 runs Iceberg 1.11.0 with v3 support: VARIANT plus shredding, deletion vectors and row lineage. Deletion vectors are what keep row-level
DELETEs cheap, which is exactly the operation Redshift'sUPDATE/DELETE/MERGEnow performs, and exam-guide skill 2.1.7 "Manage open table formats" puts schema evolution, snapshots and compaction directly in scope (AWS What's New, 28 Jul 2026; AWS Glue 6.0 announcement, 21 Aug 2026, accessed Oct 2026). - Permissions got tighter while sharing got easier: the full matrix after Redshift's behavior change:
INSERTβ INSERT,DELETEβ DELETE,UPDATE/MERGEβ INSERT + DELETE, and every Iceberg DML statement also needs ALTER. A lab (or a cross-account role) that grants onlyINSERTis now insufficient to merge a lake table, while the Lake Formation v5 wildcard share in the bullet above makes granting itself cheaper (AWS Redshift behavior-changes page, Patch 202, accessed Oct 2026).
Real-World Case Studies
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, which catalog object was shared, which schema contract was enforced, not the marketing.
Case A, BMW Group: schemas in Glue, data in S3
Element | Detail |
|---|---|
Customer | BMW Group, automotive manufacturer |
Challenge | An on-premises data lake built in 2015 could not serve multiple tenants with clear producer/consumer separation |
Services | Amazon Kinesis Data Firehose + AWS Lambda + AWS Glue + Amazon EMR on the provider side; Amazon Athena, Amazon SageMaker AI, Amazon EMR on the consumer side; layers in Amazon S3, schemas in the AWS Glue Data Catalog |
Outcomes | 10 TB/day ingested from 1.2 million vehicles; a Cloud Data Hub serving 500+ users; anonymized telemetry |
Exam domain | Domain 2, Task 2.2: the catalog is the shared contract between producer and consumer accounts |
Source | aws.amazon.com/solutions/case-studies/bmw-group-case-study/ (accessed Oct 2026) |
The examinable pattern: the data never left S3 while ownership split across accounts: Glue holds the schemas, Athena and SageMaker consume them in place. That is exactly the resource-link-plus-Lake-Formation arrangement in Section 5, and it is why "copy the data into each team's account" is a distractor: sharing belongs at the metadata layer.
Case B, GoDaddy: a data mesh on one shared catalog
Element | Detail |
|---|---|
Customer | GoDaddy, internet/tech company |
Challenge | A shared on-premises Hadoop cluster, proliferating HDFS copies and unmanageable permissions |
Services | AWS Lake Formation + AWS Glue Data Catalog + Amazon S3 + AWS RAM cross-account shares + Amazon Athena / Amazon EMR + AWS Service Catalog + AWS Lambda |
Outcomes | A hub-and-spoke data mesh with 2,000+ data products, multiple petabytes across hundreds of accounts, hundreds of producers and thousands of consumers, and a central governance account |
Exam domain | Domain 2 Tasks 2.2/2.4 with Domain 4 hooks (governance, cross-account sharing) |
Source | AWS Big Data Blog, "How GoDaddy built a data mesh to decentralize data ownership using AWS Lake Formation" (accessed Oct 2026) |
"There are over 2,000 data products built on the GoDaddy data mesh on AWS β¦ Our data mesh manages multiple petabytes of data across hundreds of accounts."
Read the number correctly: 2,000 data products is a catalog-scale problem, not a storage problem. Resource links (which render in italics, need DESCRIBE plus a target grant, and resolve only the first link in a chain) plus AWS RAM shares are what make hundreds of accounts query one Glue database without copying it.
- π Did you know? All three case studies put AWS Glue Data Catalog in the middle and none of them moved data to give a team access: BMW for producer/consumer separation, GoDaddy for mesh-wide sharing, IAS for classification-based access. That repetition is the hint: on DEA-C01, "make the data available to another account or engine" most often resolves to a catalog or permission answer (resource link, LF grant, RAM share, catalog view), not a copy answer (COPY, export, snapshot) (AWS case study and AWS Big Data Blog, accessed Oct 2026).
Case C, Integral Ad Science: hundreds of rules collapse into two tags
Element | Detail |
|---|---|
Customer | Integral Ad Science (IAS), ad-tech measurement company |
Challenge | A self-service data lake spanning producer and consumer accounts under GDPR/CCPA, where access had to follow each user's classification and job role rather than a hand-written rule per person |
Services | AWS Lake Formation with tag-based access control + AWS Glue Data Catalog + Amazon S3 + Amazon Athena + Amazon EMR + Okta federation; S3 reached only through a Lake Formation data access role |
Outcomes | Column-level access control; hundreds of permission rules reduced to precisely two; one Athena workgroup per business unit (billing tags plus query limits); database-level LF-Tags inherited by tables and columns |
Exam domain | Domain 2 Tasks 2.2/2.4 with Domain 4 hooks (tag-based access control, federated identity) |
Source | AWS Big Data Blog, "Integral Ad Science secures self-service data lake using AWS Lake Formation", 23 September 2021 (accessed Oct 2026) |
"With Lake Formation tag-based access controls, IAS reduced hundreds of permission rules down to precisely two rules."
Read the arithmetic, not the marketing: two rules is a different kind of grant, not a shorter list. A per-table policy costs roughly n(principals) Γ n(tables); a tag grant costs n(principals) + n(tag values), and because "Tables inherit LF-Tags from databases and columns inherit LF-Tags from tables" (Section 5), tagging the database once pulls every future table and column into the same policy without anyone editing a rule. The grant is written against classification=restricted, not against a table name, which is why column-level PII control survives a thousand new tables.
- π Did you know? IAS separated who may query from how much a team may run: access to individual columns was decided by Lake Formation tags, while each business unit got its own Athena workgroup carrying query limits and cost-allocation tags. Two independent control planes, grants answer "can I read this column?", workgroups answer "how far may this team go and who pays?", and exam options love to swap them (AWS Big Data Blog, accessed Oct 2026).
Practice Questions
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue crawler runs two custom classifiers for the same file: a CSV classifier (delimiter ';') listed first and a JSON classifier listed second. The file is a semicolon-delimited CSV. Which statement is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
You want a recurring crawl to stop overwriting three hand-edited columns but still register brand-new tables and partitions. What is the correct configuration?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue table has a partition index on [country, category, year] and 400,000 partitions. Which query will NOT use that index?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A team enables partition projection on a Glue table for Athena and then runs SHOW PARTITIONS. What happens, and who else can use it?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
An Athena query on a partitioned table fails with HIVE_PARTITION_SCHEMA_MISMATCH. What is the cause?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Which statement about AWS Glue Data Catalog table versioning is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A consumer account has a resource link to your Glue table but queries still fail with an access error. What is missing?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Which pair of statements about star and snowflake schemas is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A dimension row for customer 7781 moves from Seattle to Portland. Requirement: every historical order must still join to the address in force at order time. Which design meets it?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A Glue ETL job must add hourly partitioning where the table currently has daily partitions, using a Hive-style external table on S3. What is the correct assessment?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Design a DynamoDB table for: get customer by id; list that customer's orders newest-first; get one order by order id; items are up to 900 KB. Which design is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A 4 TB, 100-column uncompressed CSV table is queried for one column over one day of 365. Which sequence correctly describes the cumulative effect?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
A cross-account role must run MERGE and then DELETE on an Apache Iceberg table that is registered in the AWS Glue Data Catalog and governed by Lake Formation, after Redshift's 2026 behavior change (Patch 202). Which permission set is correct?
How to answer
Multiple-choice question with 4 options. Select one option, then choose Check Answer.
Integral Ad Science ran a lake with hundreds of consumer principals and thousands of tables, and a table created next month must be covered without anyone editing a rule. Which design reduced hundreds of permission rules to two, and why does it stay correct over time?
β οΈ Exam-day traps for this lesson:
- Crawler β classifier: the crawler orchestrates and writes; the classifier recognizes format and emits the schema, first success wins, built-ins only if none matched.
UpdateBehavior=LOGstill adds tables and partitions: pair it withAddOrUpdateBehavior=InheritFromTableto freeze them.- Index β projection β pruning: an index is stored catalog metadata (Athena additionally needs
partition_filtering.enabled=true); projection is Athena computing partitions and ignoring stored metadata; pruning is the shared outcome. - A useless index: first key missing from the expression, or an
OR/IN/LIKE/NOTin it. - Versioning is always on:
UpdateTablearchives by default; 100,000 versions/table; there is no rollback, only publish-a-new-version. - Blue/green for catalog tables is an assembled pattern, not a shipped Glue feature; DDL is not replicated in RDS/Aurora blue/green and blocks switchover.
- Resource links are two-step:
DESCRIBEon the link and a grant on the target; chains resolve only the first link; links render in italics. - Type 2 needs history rows: start date, end date (2999-12-31 for current), active flag, and an expire-then-insert in one transaction; a Type 2 that updates is a Type 1.
- Surrogate β natural β primary key: surrogate keys are generated, immutable and business-meaningless; Redshift enforces neither PK nor FK, it only uses them to plan.
- Snowflake schema = normalized dimensions, not a second fact table; grain first, then keys, and dimensions load before facts.
- Additive β always safe: append-nullable is safe; mid-table insert, reorder, drop and retype are breaking on Hive-style tables; Iceberg is where add/drop/rename/reorder are metadata-only.
- Schema Registry governs streams, not catalog tables:
SchemaArnversusTable.VersionId; it is awareness scope only. - Compression vs parallelism: GZIP is not splittable; Snappy is the Parquet default, ZLIB the ORC default.
- Case-study numbers are unaudited customer claims: BMW's 10 TB/day and GoDaddy's 2,000+ data products are reported figures, not guarantees.
- Iceberg DML needs more than
INSERT: after Redshift's Patch 202:DELETEβ DELETE,UPDATE/MERGEβ INSERT + DELETE, and every Iceberg DML statement also needs ALTER; a role granted onlyINSERTfails halfway through a merge. - Tag grants, not table lists: Lake Formation tag-based access control scales as
n(principals) + n(tag values)because tables inherit LF-Tags from databases and columns inherit from tables (IAS: hundreds of rules β exactly two); Athena workgroups set query limits and cost allocation, never table access.
Comparative Verdict: how this topic compares on exam day
- Versus other clouds: the DEA-C01 guide tests AWS services only: AWS Glue Data Catalog, AWS Lake Formation, Amazon Athena, Amazon Redshift, Amazon DynamoDB. Nothing in the guide compares AWS with another provider, so any option pivoting to a competitor's metastore, catalog or table format offering is out of scope by construction; answer with an in-scope AWS service or an AWS-published principle.
- Versus self-managed / on-premises (Hive metastore you run yourself): you can build the same tree on Hadoop, but then you own the metastore's availability, its IAM, its cross-account story and its scaling. The exam's preference is the managed, shared metadata layer, Glue plus Lake Formation grants, with the Apache Hive metastore appearing as the concept the Data Catalog implements (Task 2.2.2 names both). Choose the option with the least undifferentiated operational work.
- Versus another AWS service in the same layer: Glue Data Catalog is the metadata store; Athena is the query engine; Lake Formation is the permission plane; Amazon SageMaker Catalog is the business/governance catalog (skill 2.2.6); Glue crawlers are the discovery mechanism. A question asking "where is the schema registered" never answers "Athena", and one asking "who may read this column" never answers "Glue": Lake Formation grants and LF-Tags do that.
- Versus a manual, human process: GoDaddy's 2,000+ data products and BMW's 10 TB/day (customer claims, accessed Oct 2026) are outcomes of mechanisms, crawls, resource links, LF grants, partition indexes, not of someone maintaining a spreadsheet of table locations. On the exam, prefer the option that automates registration, synchronization or permissioning over the option that requires an engineer to remember.
Key Takeaways:
- The Glue Data Catalog is a metadata-only tree,
catalog β database β table β partitions, that one set of definitions feeds Athena, Redshift Spectrum, EMR, Glue ETL and SageMaker AI; quotas as of Oct 2026 include 10,000 databases, 200,000 tables/database, 10,000,000 partitions/table, 100,000 versions/table and 3 partition indexes/table. - Crawlers run your custom classifiers in your order, first success wins, built-ins only if none matched; folder majority-similarity creates partitions rather than tables, and
SchemaChangePolicynever stops new tables/partitions unless you addAddOrUpdateBehavior=InheritFromTable. - Crawlers bill $0.44/DPU-hour with a 10-minute minimum (1 DPU = 4 vCPU + 16 GB), so event-driven incremental crawls, not hourly schedules, are the cost answer.
- Partition index = stored subset fetch for
GetPartitions(max 3, first key must appear, onlyAND; Athena also needspartition_filtering.enabled=true); projection = Athena computes partitions and ignores stored metadata (Athena-only,SHOW PARTITIONSempty, >50% empty β revert); pruning = the shared result. - Table versioning is always on (
UpdateTablearchives,VersionId+1), there is no rollback, only publish-a-new-version, and a blue/green table swap is an assembled pattern (catalog view, resource link, version publish) with the rule additive before code deploy, deletive after. - Resource links are two-step:
DESCRIBEon the (italic) link plus a grant on the target; they cross accounts and Regions; chains resolve only the first link; sharing runs through Lake Formation + AWS RAM or legacy IAM-only Glue permissions. - Grain first, then keys: facts hold measures and foreign keys, dimensions give the measures business meaning, surrogate keys are generated/immutable/business-meaningless (
IDENTITYin Redshift), and dimensions load before facts: a failed dimension load must block the fact load. - Star vs snowflake: snowflake "further normalizes the dimensions into multiple tables" (more joins); AWS prefers the star where it aligns with the business process because columnar compression makes denormalized keys cheap.
- SCD Type 1 overwrites (no history); Type 2 inserts a new row with
record_start_date,record_end_date(2999-12-31when current) andactive_flag, expired and inserted in one transaction, matched by left outer join and hashed (sha2/FNV_HASH/CHECKSUM); Type 3 keeps only the previous value: Types 4 to 7 are not defined in AWS sources. - Redshift denormalization: fact
DISTKEY= FK of the largest frequently joined dimension, matched on that dimension, small dimensionsDISTSTYLE ALL, declared PK/FK used by the optimizer only, plusSORTKEYfor min/max skipping. - Schema evolution: additive = append-nullable; breaking = drop, retype/narrow, reorder, rename (Hive), and any partition-layout change: "Hive table partitioning cannot changeβ¦" while Iceberg schema and partition evolution are metadata-only with stable field IDs and split planning.
- DynamoDB single-table design starts from access patterns: high-cardinality partition key (equality), sort key for one-to-many and ordering, sparse/overloaded GSIs with
KEYS_ONLY/INCLUDE/ALLprojections, write sharding at 3,000 RCU/s / 1,000 WCU/s, 400 KB item limit and 1 KB write-billing steps (β€4 PK + 4 SK = 8 key attributes). - The optimization ladder compounds outside-in, partition β bucket β sort β columnar β compression β file size, and each layer removes roughly an order of magnitude: 4 TB CSV β ~1 TB GZIP β ~10 GB Parquet 1-column β ~28 MB partitioned, which at Athena's $5/TB scanned (10 MB minimum, as of Oct 2026) is about 5 β $0.05 β fractions of a cent.
- October 2026 state of the topic: exam guide v1.1 (12 Dec 2025) adds skill 2.1.7 open table formats and 2.2.6 business catalogs (SageMaker Catalog) with SCT removed in favour of DMS Schema Conversion; Glue 6.0 (21 Aug 2026) cuts price 30% and drops EMRFS and AWS SDK for Java v1; Glue 0.9/1.0/2.0 EOL 1 Apr 2026; Lake Formation sharing v5 (11 Feb 2026) lets one RAM share carry unlimited tables; Redshift now writes, MERGEs and materializes Iceberg tables registered in the Glue Data Catalog.
- Catalog-side 2026 additions worth memorising: the Glue Data Catalog gained materialized views (30 Nov 2025); Athena added statistics-driven Iceberg cost-based optimization that works with Lake Formation row filters and column masks (21 Nov 2025) and cut its Capacity Reservation floor to 4 DPU / 1 minute (was 24 DPU / 60 min, 11 Feb 2026); Iceberg format v3 (VARIANT, deletion vectors, row lineage) ships in Glue 6.0 with the Variant type on S3 Tables (28 Jul 2026); Redshift's Patch 202 means
UPDATE/MERGEneed INSERT + DELETE and all Iceberg DML needs ALTER; and Integral Ad Science proved the tag model: Lake Formation tag-based access control collapsed hundreds of permission rules into exactly two, because grants are written against LF-Tags that tables inherit from their database and columns inherit from their table (all figures AWS-published, accessed Oct 2026).