Topic domain
Data Engineering
Pipelines that move and reshape data reliably.
- Articles
- 80
- Clusters
- 8
- Foundational
- 24
- Intermediate
- 32
- Advanced
- 24
Data Formats
10Columnar layout, serialization, and schemas.
- Columnar Layout and the Cost of Reading One Field
- Null Representation: Validity Bitmaps Against Sentinel Values
- Varints, Zigzag, and Prefix Encoding of Integers
- Inside a Parquet File: Row Groups, Pages, and the Footer
- Dictionary Encoding and the Cardinality Cliff
- Schema Evolution Without Rewriting Files
Partitioned jobs and shuffle mechanics.
- Input Splits Determine Task Granularity in Batch Jobs
- How a Partitioner Maps Keys to Reduce Tasks
- What a Shuffle Moves Between Map and Reduce Stages
- Pre-Aggregating Map Output with Combiners
- Sort-Based and Hash-Based Shuffle Implementations
- Hot Keys, Skew, and Load Imbalance in Hash Partitioning
Event time, watermarks, and state.
- Event Time and Processing Time in a Stream Operator
- Watermarks as Completeness Signals
- Window Assignment and Trigger Semantics
- Measuring Disorder to Size a Lateness Budget
- Keyed State Layout and the Cost of Keeping It
- Interval Joins Over Event Time
Ingestion
10Connectors, exactly-once claims, and backfill.
- Cursor Columns and Where the Next Incremental Read Starts
- Log-Based Capture and the Write-Ahead Log as a Change Feed
- Snapshot to Stream: Establishing a Position Without Losing Writes
- Where the Checkpoint Goes: Offset Ordering and Two Failure Directions
- What Exactly-Once Delivery Requires at Each Hop
- Backfilling a Table While Its Stream Keeps Running
Dimensional design and slowly changing dimensions.
- Grain: What One Row of a Fact Table Means
- Star Schemas and the Cost of Normalizing a Dimension
- Conformed Dimensions and the Bus Matrix
- Type 2 Slowly Changing Dimensions: Versions, Validity and Lookups
- Choosing Between SCD Types 1, 2, 3 and 6
- Mini-Dimensions and Junk Dimensions: Narrowing a Wide Fact Table
Dependency graphs and retry semantics.
- Topological Readiness in Workflow Dependency Graphs
- Trigger Rules and Failure Propagation Across a Dependency Graph
- Idempotent Task Boundaries and Atomic Output Publication
- Retry Policy Design: Error Classification, Backoff, and Jitter
- Durable Run State and Scheduler Reconciliation
- Logical Dates, Interval Boundaries, and Catchup Semantics
Data Quality
10Validation, lineage, and anomaly detection.
- Where a Schema Contract Is Enforced, and What It Cannot Catch
- Row Identity and Why Deduplication Needs a Key, Not a Comparison
- Measuring Freshness From Event Time, Not Arrival Time
- How Null Rates and Distinct Counts Detect a Broken Join
- Partition Statistics as Validation Signals
- Column-Level Lineage and the Cost of Tracking It
Table formats and open storage layers.
- How a Table Format Replaces Directory Listing with a Metadata Tree
- File Pruning from Per-File Min and Max Statistics
- Atomic Commits and Snapshot Isolation Between Concurrent Writers
- Partition Evolution Without Rewriting Existing Data
- Why Columns Need Identifiers Rather Than Names
- Delete Files and the Cost of Merge-on-Read
All Data Engineering articles
- Oct 12, 2026 Dynamic Task Mapping: Graphs Expanded at Run Time What changes when the number of tasks is unknown at definition time, how map indices are keyed, and why the reduce step is the hard part.
- Sep 25, 2026 Topological Readiness in Workflow Dependency Graphs How a scheduler decides which task may start, why the dependency edge carries ordering rather than data, and what the critical path bounds.
- Sep 23, 2026 Atomic Commits and Snapshot Isolation Between Concurrent Writers What makes a commit atomic when the storage offers only single-object writes, how two writers racing on the same table are serialized, and which conflicts are detected only at commit time.
- Sep 21, 2026 Seasonal Baselines and the False Alerts They Prevent A fixed threshold on a metric that varies by weekday produces a stream of alerts that gets ignored; a baseline has to model the periodicity it is compared against.
- Sep 2, 2026 Partition Statistics as Validation Signals Per-partition row counts, byte sizes, and file counts are metadata, so checking them costs almost nothing; the hard part is knowing which deviation means which fault.
- Aug 20, 2026 Deletes, Tombstones, and the Append-Only Sink Object storage cannot delete a row in place, so removal becomes a recorded fact with a retention period, and every reader must agree on how to apply it.
- Aug 14, 2026 Delete Files and the Cost of Merge-on-Read How a row-level delete is expressed without rewriting a data file, what a reader must do to apply it, and why position-based deletes are cheaper than equality-based ones.
- Aug 5, 2026 Snapshot to Stream: Establishing a Position Without Losing Writes Why a consistent snapshot and a log start point cannot be taken atomically by an unprivileged client, and the three mechanisms that close the gap.
- Aug 4, 2026 Evolving a Dimensional Model Without Rewriting Its History Which schema changes are additive, which silently change a measure's meaning, and how to refine a grain or retire a column while old and new consumers coexist.
- Jul 9, 2026 How a Table Format Replaces Directory Listing with a Metadata Tree Why a lakehouse table is defined by a chain of metadata files rather than by the contents of a prefix, and what each level of that chain costs a reader to open.
- Jun 11, 2026 Orphan Keys: Checking Referential Integrity Without Foreign Keys Warehouses rarely enforce foreign keys, so referential integrity becomes a scheduled anti-join; its cost, its two directions, and the time dimension that makes it ambiguous.
- Jun 10, 2026 Choosing Between SCD Types 1, 2, 3 and 6 The cost of overwriting an attribute, the cost of versioning it, and the cost of keeping a previous value in a column, set against the questions each type can and cannot answer.
- May 21, 2026 Window Assignment and Trigger Semantics How an event is mapped to windows, why sliding windows multiply state, and how triggers separate when a result is emitted from what it contains.
- Apr 23, 2026 What a Shuffle Moves Between Map and Reduce Stages The mechanics of the map-side write, the network fetch, and the reduce-side merge: what actually crosses the wire, and why the stage boundary exists at all.
- Apr 14, 2026 Inside a Parquet File: Row Groups, Pages, and the Footer How a Parquet file arranges column chunks, pages, and a trailing metadata block, why the footer is written last, and what the layout forces on readers and writers.
- Apr 7, 2026 Late-Arriving Dimensions and Inferred Members What happens when a fact references an entity the dimension has never seen, how inferred rows let the fact load proceed, and why the placeholder key is a debt with an interest rate.
- Mar 8, 2026 Split Discovery and Why a Parallel Read Is Not a Consistent Read How a connector partitions a table into independently readable ranges, and why the boundaries it discovers are only correct if the key distribution does not change.
- Mar 3, 2026 Logical Dates, Interval Boundaries, and Catchup Semantics Why a scheduled run carries a date it did not start on, how intervals are made half-open, and what happens when the schedule falls behind.
- Feb 9, 2026 Mini-Dimensions and Junk Dimensions: Narrowing a Wide Fact Table How to keep fast-changing attributes out of a versioned dimension, and how to collapse a handful of low-cardinality flags into one key instead of a dozen foreign keys.
- Jan 18, 2026 Rescaling Keyed State Without Replaying History Why changing an operator's parallelism redistributes state, how the key-group indirection makes the move a file copy, and what forces a full replay instead.
- Jan 13, 2026 Watermarks as Completeness Signals How a watermark asserts that no earlier event will arrive, how it is propagated through operators, and what happens when the assertion is wrong.
- Jan 9, 2026 Backfill Concurrency and Collisions with the Live Schedule Why reprocessing history competes with today's run for the same slots, how partition locks arbitrate, and where the contention actually appears.
- Jan 2, 2026 Conformed Dimensions and the Bus Matrix Why two fact tables can only be compared when they share identical dimension keys and members, and how a bus matrix plans those dimensions before any table is built.
- Dec 30, 2025 Idempotent Task Boundaries and Atomic Output Publication How a task makes a second execution safe, why writing to a staging location and swapping is cheaper than deduplication, and what the swap cannot protect.
- Dec 11, 2025 Columnar Layout and the Cost of Reading One Field How storing each field in its own contiguous run changes the bytes a scan touches, why homogeneous columns compress better, and what the layout gives up on point reads and updates.
- Dec 11, 2025 Compression Blocks and the Loss of Splittability Why a compressor with a shared window makes a file unreadable from the middle, how block-structured codecs restore parallel reads, and what the block size trades away.
- Dec 8, 2025 Durable Run State and Scheduler Reconciliation How a scheduler recovers after its own crash, why run state must be committed before a task is dispatched, and what the reconcile loop compares.
- Nov 17, 2025 Backfilling a Table While Its Stream Keeps Running A historical re-read competes with the live feed for the same keys, so the merge rule and the rate limit matter more than the query itself.
- Oct 22, 2025 Why Exactly-Once Delivery Stops at the Workflow Boundary How end-to-end exactly-once requires three coordinated commits, which participant in a scheduled workflow cannot supply one, and what the achievable guarantee actually is.
- Oct 2, 2025 Measuring Disorder to Size a Lateness Budget How to derive the watermark delay and allowed lateness from the arrival-delay distribution, and why a percentile is the only honest input to that choice.
- Sep 24, 2025 Varints, Zigzag, and Prefix Encoding of Integers Why a variable-length integer encoding trades a length prefix for width, how zigzag folds signed values into the small-number space, and where the scheme degenerates to fixed width.
- Sep 20, 2025 Accumulating Snapshot Fact Tables: One Row Per Process, Updated in Place How a fact row can be rewritten as an order moves through picking, shipping and delivery, which measures stay additive, and why the row must be created before the process finishes.
- Sep 8, 2025 Adaptive Partitioning and Runtime Repartitioning How a shuffle writer reports per-partition sizes at the stage barrier, and how coalescing and splitting use that report to correct a partition count chosen before the data was read.
- Sep 8, 2025 How Null Rates and Distinct Counts Detect a Broken Join Column profiles are cheap aggregates that catch errors no type check can: a null-rate jump or a collapsed distinct count localises a fault to one column.
- Aug 6, 2025 Partition Evolution Without Rewriting Existing Data How a table can change its partition granularity while old files keep their original layout, why the manifest must record the spec that produced each file, and what queries pay for the mixture.
- Jul 4, 2025 Reconciling a Load: Counting Rows Is the Weakest Possible Check A row-count comparison agrees on many wrong tables, so reconciliation has to compare keys, then values, and needs a position to compare at.
- Jul 2, 2025 Sort-Based and Hash-Based Shuffle Implementations Two ways to build the map-side shuffle output, how each one trades sort CPU for file count, and why the file count grows with the reduce task count.
- Jun 24, 2025 Dictionary Encoding and the Cardinality Cliff How replacing repeated values with ordinals shrinks a column, why the win collapses as distinct values grow, and what happens to a column chunk when the dictionary outgrows its budget.
- Jun 11, 2025 Deriving a Change Feed from Immutable Snapshots How a table format turns the difference between two snapshots into a stream of inserted and deleted rows, which changes it cannot recover, and why ordering must come from sequence numbers.
- Jun 11, 2025 Shuffle Fault Tolerance: Recomputing Lost Map Output Why map output is an unreplicated cache on local disk, what a lost segment costs downstream, and how lineage and shuffle services change the recovery path.
- May 6, 2025 Map-Side Buffer Budgets and the Cost of Spilling Why the sort buffer is a fixed per-task budget, what the spill threshold implies for merge passes, and how much extra I/O a spill actually costs.
- May 6, 2025 Retractions and Updating Results How a stream of window results becomes a changelog, what a retraction record must contain, and why consumers must know the difference between a delta and a replacement.
- Feb 19, 2025 Column Statistics and the Page-Skipping Decision How min/max bounds, null counts, and bloom filters let a reader discard data without decoding it, and why clustering, sorting, and type all change how much they prune.
- Jan 15, 2025 File Pruning from Per-File Min and Max Statistics How bounds recorded per column chunk let a scan skip whole files, why the pruning rate collapses on high-cardinality or unsorted columns, and how the statistics get into the manifest in the first place.
- Jan 13, 2025 Two-Phase Commit and Exactly-Once Sinks Why a stream job cannot deliver exactly once without the sink participating, and how a prepare-then-commit protocol ties checkpoint state to external writes.
- Jan 10, 2025 Where the Checkpoint Goes: Offset Ordering and Two Failure Directions Committing a read position before or after the sink write chooses between losing data and repeating it, and the choice propagates through every downstream consumer.
- Nov 3, 2024 Keyed State Layout and the Cost of Keeping It What a keyed operator stores per key, how state backends trade heap for disk, and why a growing key space is the failure that has no trigger.
- Oct 31, 2024 Star Schemas and the Cost of Normalizing a Dimension What denormalizing a dimension into one wide table buys at query time, what it costs in update work, and why snowflaking usually loses on columnar storage.
- Oct 15, 2024 Interval Joins Over Event Time Why a stream-stream join must buffer both sides, how the watermark of the slower input gates the match, and where the retained state actually goes.
- Oct 10, 2024 Grain: What One Row of a Fact Table Means Why the grain declaration precedes every column choice, how it fixes which measures can be summed, and what a join at the wrong level does to a count.
- Sep 28, 2024 Catalogs, Table Identity, and What a Table Name Resolves To Why a table needs a registry separate from its files, how the catalog performs the pointer swap that makes a commit visible, and what breaks when the name and the location drift apart.
- Sep 24, 2024 How a Partitioner Maps Keys to Reduce Tasks Why the reduce task count is fixed before any record is read, what hash-modulo partitioning guarantees, and why changing the count remaps almost every key.
- Sep 16, 2024 Where a Schema Contract Is Enforced, and What It Cannot Catch Write-time validation against a declared schema, read-time inference, and the class of errors that survives both: structural checks constrain types, not meanings.
- Aug 19, 2024 Small File Accumulation and What Compaction Must Preserve Why frequent small commits degrade a table long after the commits stop, how a compaction job rewrites files without breaking snapshots, and which invariants it cannot violate.
- May 14, 2024 Pre-Aggregating Map Output with Combiners The associativity contract a combiner must satisfy, where the framework applies it, and how much shuffle volume it removes when key cardinality is low.
- May 14, 2024 Worker Leases, Heartbeats, and the Zombie Task Problem How a lease turns liveness into a deadline, why an expired lease cannot prove a task stopped, and how fencing tokens contain the overlap.
- Apr 13, 2024 Type 2 Slowly Changing Dimensions: Versions, Validity and Lookups How a dimension row is versioned with surrogate keys and effective dates, why the load-time lookup is the hard part, and how facts join to the version that was current when they occurred.
- Mar 25, 2024 Column-Level Lineage and the Cost of Tracking It Deriving which upstream column feeds which downstream column requires parsing every query; the alternative is coarse and the fine-grained version has an unbounded cost.
- Feb 1, 2024 Trigger Rules and Failure Propagation Across a Dependency Graph Why all-success is only one of several completion conditions, how per-edge skip states propagate downstream, and what an any-failed branch costs.
- Jan 10, 2024 Snapshot Expiry, Reference Counting, and Files That Nothing Points To Why deleting an old snapshot does not delete its files, how a sweeper decides which objects are unreferenced, and the two ways that decision goes wrong in opposite directions.
- Jan 7, 2024 Cursor Columns and Where the Next Incremental Read Starts How a polling connector decides which rows are new, why a timestamp cursor loses rows at ties and clock skew, and what a composite keyset cursor fixes.
- Dec 19, 2023 Schema Drift at the Connector Boundary A source that adds a column or widens a type breaks a connector in ways that depend on whether the change is read-time, write-time, or decode-time.
- Dec 18, 2023 Arrow Buffer Layout and Where Zero-Copy Stops How an Arrow array is a handful of flat buffers plus a length, which conversions can reuse memory in place, and which schema and lifetime conditions force a copy.
- Oct 18, 2023 Quarantine and Replay: What Happens to Records That Fail Validation Rejecting a record is a write to a second table, and replaying it later is a second write path; both need a schema, an ordering rule, and a bound on how long they stay open.
- Sep 14, 2023 Bitemporal Dimension History: Effective Time and Assertion Time Why a single validity interval cannot express both when an attribute was true and when the warehouse believed it, and what two intervals cost in keys, joins and corrections.
- Sep 1, 2023 Schema Evolution Without Rewriting Files Why field names cannot identify a column across versions, how numeric field identifiers make renames and reordering safe, and which schema changes remain illegal regardless of identifiers.
- Aug 14, 2023 Measuring Freshness From Event Time, Not Arrival Time A table can be loaded on schedule and still be stale: lag is a distribution over records, and comparing the newest row timestamp to the clock hides the tail.
- Jul 16, 2023 Repetition and Definition Levels in Nested Columns How two small integers per value encode the full structure of nested and repeated fields, what an empty list looks like on disk, and why the encoding stays independent of the record shape.
- Jul 6, 2023 Two-Sample Tests for Distribution Drift in a Column A mean and a count can hold steady while a column reshapes itself; comparing histograms detects that, but the test, the bins, and the sample size all change the answer.
- Jun 26, 2023 What Exactly-Once Delivery Requires at Each Hop The guarantee is a conjunction of idempotence keys, transactional positions, and source cooperation, and it terminates at the first hop that lacks any of them.
- Jun 11, 2023 Log-Based Capture and the Write-Ahead Log as a Change Feed Why the redo log is a more faithful record of commits than any table query, how decoding turns physical records into row images, and what retention forces.
- Mar 3, 2023 Retry Policy Design: Error Classification, Backoff, and Jitter Which failures deserve another attempt, how exponential backoff and jitter change the arrival distribution, and why a retry can make an outage worse.
- Feb 22, 2023 Why Columns Need Identifiers Rather Than Names How field identifiers let a renamed or reordered column keep its meaning across old files, which type promotions the format permits, and why a name-based schema cannot express either.
- Feb 7, 2023 Checkpoint Barriers and Aligned Snapshots How a barrier injected at the source cuts a consistent snapshot across a distributed operator graph, and what alignment costs when one channel stalls.
- Dec 5, 2022 Row Identity and Why Deduplication Needs a Key, Not a Comparison Deciding that two records describe the same entity requires a declared key; comparing whole rows fails on late-arriving corrections, and windowed dedup only moves the ambiguity.
- Nov 4, 2022 Input Splits Determine Task Granularity in Batch Jobs How a batch framework derives splits from filesystem blocks, why split size sets the task count, and what happens when files are small or compression is not splittable.
- Aug 7, 2022 Hot Keys, Skew, and Load Imbalance in Hash Partitioning Why a partitioner that distributes keys evenly can still produce one task with sixty times the average work, and the static and sampled fixes that spread that load.
- May 4, 2022 Event Time and Processing Time in a Stream Operator Why the clock an operator reads decides whether a replay reproduces its output, and how the two clocks diverge when a source falls behind.
- Mar 9, 2022 Null Representation: Validity Bitmaps Against Sentinel Values How a columnar format records the absence of a value, why a separate bitmap costs one bit per value, and when an in-band sentinel breaks the type system.
- Dec 26, 2021 Co-Partitioned Datasets and Shuffle-Free Joins How persisting a hash or range partitioning in the table layout lets later joins read bucket against bucket, and the metadata mismatches that silently undo it.