Crosshire
Ingestion
Foundation03 Ingestion · 1 of 3

One decision table

There are four source shapes. The shape is a property of the source, not a choice you get to make.

Stand 29.07.2026

#Pick by source shape, not by source system

What
The question that selects the pattern is not which system is this. It is can I tell what changed, and can I tell what was deleted? Connector, format and vendor all follow from those two answers.
Source shape → pattern → what it costs to get wrong
Source shapePatternLands inCost of the wrong choice
Files in a Volume, schema driftsAuto Loader streaming table, schema location per streambronze.shop_ordera folder listing that double-counts any file landing twice
Change feed with a sequence (CDC)AUTO CDC flow, sequence_by the change counterbronze.sap_vbak, bronze.sap_vbapa MERGE keyed on a timestamp: same-second changes apply in arbitrary order
Full extract, no change timestampappend every extract, diff consecutive snapshotsbronze.sap_kna1no history at all, or every unchanged row versioned daily
Dated reference file, insert-onlyAuto Loader, unique on (currency, rate_date)bronze.fx_rateone duplicated rate row fans out the join and doubles amount_eur
API with a paging cursorland the raw response as files, then pattern onea Volume, then bronzea parse bug you cannot re-run — the API will not return that page again
Why
The failure this prevents is pattern proliferation: six sources, six notebooks, each with its own idea of restart, deduplication and lateness. Nothing is broken and nothing is reviewable — the author of source three is the only person who can fix source three.
The subtler failure is choosing a pattern one shape too weak. The webshop feed starts as just read the folder each night, which holds until a file lands late, lands twice, or a run dies half-written. Each is a silent wrong number, and the fix is a backfill rather than an option change.
Doing it
  • Answer both questions in the ticket first: can I tell what changed, can I tell what was deleted
  • Land raw before parsing for anything you cannot re-request
  • Give each stream its own schema location and checkpoint; never share a path
  • Add the three technical columns in the framework, so a new source cannot forget them
Embedding it
  • Hand the team the next new source with only this table and no instructionsWhich pattern they pick, and why, is the whole assessment.
  • When someone proposes a bespoke ingestion, ask which shape it is and what breaks in that oneUsually the answer is 'nothing — it is how the last project did it'.
  • Have them write the row for the next source, cost column includedWriting that column is where the thinking happens.
Defaults
  • Four patterns, each selected by an observable property of the source
  • Raw lands before it is parsed; parsing belongs downstream of a durable copy
  • Bronze is append-only and carries the three technical columns
  • One stream, one schema location, one checkpoint
Gotchas
  • Choosing CDC because the source system offers CDC, when what arrives is a nightly full dumpsequence_by is then identical for every row in the file, and last-writer-wins picks an arbitrary version of each customer.
  • Reading a Volume with spark.read 'because there are only a few files'It works for a year; then the folder holds 400,000 files, the nightly listing takes six hours, and you migrate under pressure.
  • Parsing during ingestionA field the shop team changed on Tuesday is unrecoverable for Monday, because bronze holds your interpretation of the file rather than the file.
  • Assuming a full extract lets you skip historyIt is the only shape that reveals deletions — and the only one where a truncated file is indistinguishable from a mass delete.
Platform facts on this page verified 29.07.2026 against the official documentation. Volatile claims are anchored to the currency register. This is section 1 of 3 in 03 Ingestion.