Self-Assessment Quiz: Data Lakes
Twenty questions. Aim for 16 or more.
Question 1
In S3, events/date=2025-11-28/part-0.parquet is:
- A. A path with two directories and a file
- B. A single opaque key in a flat key-value store
- C. A symbolic link
- D. A prefix with an implicit directory object
Question 2
"Renaming a directory" of 34,560 objects requires:
- A. One atomic metadata operation
- B. 34,560 copies and 34,560 deletes, non-atomically
- C. A single
MOVEAPI call - D. Rewriting the bucket index
Question 3
Object immutability is the reason:
- A. S3 is cheap
- B. Lakehouse table formats exist
- C. Parquet uses row groups
- D. Listing is paginated
Question 4
S3's consistency model:
- A. Is still eventually consistent for overwrites
- B. Became strongly read-after-write consistent for all operations in December 2020
- C. Depends on the storage class
- D. Requires a consistency layer for correctness
Question 5
A Parquet reader's first action is to:
- A. Read the first row group
- B. List all files in the prefix
- C. Read the last 8 bytes to find the footer
- D. Decompress the first page
Question 6
The Parquet footer is at the end of the file because:
- A. It compresses better there
- B. The writer can stream data without knowing statistics in advance
- C. It makes the file smaller
- D. Readers process files backwards
Question 7
A truncated Parquet file is:
- A. Partially readable, up to the truncation point
- B. Entirely unreadable — it fails cleanly
- C. Readable with a repair tool only
- D. Readable but silently missing rows
Question 8
The decisive reason for separate buckets per layer is:
- A. Lifecycle policies
- B. Access control is per bucket
- C. Cost attribution
- D. Blast radius
Question 9
Putting the schema version in the object path:
- A. Is required by Parquet
- B. Costs nothing to add and is impossible to retrofit
- C. Improves compression
- D. Enables partition pruning
Question 10
Bronze is partitioned by ingest date rather than event date because:
- A. Ingest date compresses better
- B. Partitioning bronze by event date means a late arrival must modify an old partition — a non-atomic rewrite while people are reading
- C. Event date is not always available
- D. Silver requires it
Question 11
"Landing raw" means storing:
- A. Parsed JSON with types applied
- B. Exactly what the source sent, plus receipt metadata, payload unparsed
- C. Deduplicated records with a schema
- D. Only the fields you currently use
Question 12
The payload is kept as a string rather than parsed because:
- A. Strings compress better
- B. Parsing at landing forces a decision about unparseable records, and every answer loses information
- C. Parquet cannot store nested data
- D. It makes the write faster
Question 13
The strongest argument against keeping raw data forever is:
- A. Storage cost
- B. Erasure obligations — raw data contains personal data you have committed to deleting
- C. Query performance
- D. Catalog size
Question 14
Partitioning Kestrel's clickstream by customer_id would produce roughly:
- A. 365 partitions
- B. 8,760 partitions
- C. 1.9 million partitions
- D. 47,000 partitions
Question 15
For a lake dataset, the correct treatment of a high-cardinality column you filter on is:
- A. Partition by it
- B. Sort by it within a low-cardinality partition
- C. Create an index on it
- D. Store it in a separate dataset
Question 16
A consumer committing every 30 seconds across 12 partitions produces roughly how many files a year?
- A. 34,560
- B. 420,000
- C. 12.6 million
- D. 150 million
Question 17
The largest cost of the small-files problem is:
- A. Request charges
- B. Latency — 63 minutes of pure request latency at 100-way parallelism for a full-year scan
- C. Storage
- D. Catalog entries
Question 18
Which is NOT one of the three properties of a good compaction job?
- A. It sorts
- B. It writes then swaps
- C. It runs on a lag
- D. It deletes the small files before writing
Question 19
Which practice is NOT one of the seven that separate a lake from a swamp?
- A. A catalog of what exists and who owns it
- B. Compaction and layout maintenance
- C. Storing everything in a single bucket for simplicity
- D. A retention policy, enforced automatically
Question 20
The minimum viable interface for a lake other people consume is:
- A. Direct file access with a documented path convention
- B. A catalog over the files
- C. A table format such as Delta or Iceberg
- D. A REST API
Answer Key
1. B — §9.1. The slashes are just characters. Everything else in §9.1 follows from this.
2. B — §9.1, ⚠️ callout. Slow, billed, and — the real problem — a reader listing mid-move gets a partial result and does not error.
3. B — §9.1. Updating one row means rewriting a whole file, and doing that safely while others read requires a protocol object storage does not provide.
4. B — §9.1, and Chapter 4 §4.4. Pre-2021 workaround advice is obsolete and still ranks well in search.
5. C — §9.2. Then the footer, which gives schema, offsets, and statistics with no data read.
6. B — §9.2. And a reader can fetch it with one small range request before deciding what else to fetch.
7. B — §9.2. A real operational property: an interrupted write fails cleanly rather than returning partial data silently.
8. B — §9.3. A bucket policy versus a prefix-condition policy — expressible either way, and much easier to get subtly wrong the second way.
9. B — §9.3, rule 2. When a breaking change arrives, v2/ sits beside v1/.
10. B — §9.3, 📐 callout. The write path gets the simple option because the alternative's failure is worse.
11. B — §9.4.
12. B — §9.4. Drop it and it is gone; null the fields and the original is lost; fail the batch and you lose availability for one bad record. Storing bytes defers the decision.
13. B — §9.4, 🔐 callout. Not cost — at Kestrel it is $7.84 a month.
14. C — §9.5. 1,900 LIST calls before reading a byte, $0.76 per query in requests, and a
catalog that degrades.
15. B — §9.5. Most of the skipping benefit, none of the metadata explosion.
16. C — §9.6. 34,560/day × 365, averaging 27 KB.
17. B — §9.6. Against roughly 30 seconds for the same bytes in 1,332 well-sized files. Requests are only $5.05.
18. D — §9.6. Never delete first — that leaves a window in which the partition is empty or partial, and readers do not error.
19. C — §9.7. Separate buckets per layer is the recommendation; a single bucket is what makes access control and lifecycle policy harder.
20. B — §9.8. Direct file access is fine for exploration and a liability as an interface, because every consumer must know the path convention and nothing tells them when it changes.
Topic map
| Missed | Reread |
|---|---|
| 1, 2, 3, 4 | §9.1 — object storage is not a filesystem |
| 5, 6, 7 | §9.2 — inside a Parquet file |
| 8, 9, 10 | §9.3 — layout |
| 11, 12, 13 | §9.4 — landing raw |
| 14, 15 | §9.5 — partitioning |
| 16, 17, 18 | §9.6 — small files and compaction |
| 19 | §9.7 — lake versus swamp |
| 20 | §9.8 — querying a lake |