The Ultimate Guide to Data Lakes
June 2026
A practical guide to data lakes: what they are, how object storage, table formats, catalogs, and engines fit together, and why file layout, schema evolution, and ownership decide whether a lake stays useful.
Start Here: What a Data Lake Actually Is
A data lake is a storage-first analytical system that keeps large volumes of raw or lightly processed data in durable, relatively cheap storage while letting other tools discover, query, or transform it later. In practice that usually means object storage such as S3, ADLS, or GCS plus some combination of metadata, catalogs, table formats, and query engines.
The important part is not just that the storage is cheap. The important part is that the lake can preserve raw fidelity, hold many kinds of data at once, and support more than one downstream use. Product events, database exports, partner files, CDC history, and machine-generated logs can all live in the same broad storage system without forcing every dataset into the same warehouse table contract on day one.
A concrete example helps. Imagine product events arriving as Parquet in S3, vendor billing exports landing daily as CSV, and a curated Delta table on the same object store holding cleaned account activity. Athena might expose part of that estate as a shared SQL query surface, while another engine or batch process reads the same storage differently. That whole shape is much closer to a real data lake than a single warehouse database full of tightly managed relational tables.
The mistake is to think a lake is automatically any bucket with files in it. A random bucket is just storage. A useful lake adds naming discipline, metadata, ownership, and a clear answer to which engines and consumers are allowed to rely on which datasets. Patterns such as bronze, silver, and gold can be layered on top of a lake, but they are optional operating choices rather than part of the base definition.
- Data lakes are strongest when you need low-cost retention, mixed data types, raw fidelity, or more than one engine reading from the same storage layer.
- Data lakes are not just cheap warehouses; they shift more responsibility onto file layout, metadata, and operating discipline.
- Data lakes can hold raw and curated data, but the contracts for those zones need to stay explicit or the lake turns into a swamp.
- Data lakes are not mandatory; if the team mostly wants governed SQL tables with predictable semantics, a cloud warehouse may be the simpler home.
The Mental Model: Storage, Table Format, Catalog, and Engine
The easiest way to understand a data lake is to separate the stack into four pieces. Teams get confused when they compress them into one vague idea called "the lake."
PieceMain question it answersExamplesWhat breaks if it is weakStorage layerWhere do the files or table data physically live?S3, ADLS, GCSRetention, access, and path discipline become chaoticTable formatHow do readers understand snapshots, schema, and file membership?Plain Parquet folders, Delta Lake, Iceberg, HudiReaders disagree about what the table means or which files belongCatalog or metadata layerHow do engines and humans discover datasets?Glue catalog, Hive metastore, platform catalogsThe data exists but nobody can find it or trust its contractEngineWho reads or transforms the data?Athena, Spark, Databricks SQL, Trino, Synapse serverless SQLThe lake turns into retained files with no sane analytical access path
This matters because you can change one layer without changing the others. A team may keep the same S3 storage and Glue catalog while shifting from one query engine to another. Or it may adopt a stronger table format such as Delta Lake without changing the underlying object store. Thinking this way makes lake design much clearer than asking whether a product is or is not a lakehouse.
A Bucket Full of Files Is Storage, Not Yet a Useful Lake
The phrase "data lake" gets overused because object storage is easy to create. What is hard is making that storage legible over time.
Suppose a team dumps partner exports into s3://company-data/exports/ for six months. The files exist, but the critical questions remain unanswered: which partner produced which schema, which files are superseded, what partitioning rule is stable, which ones are safe for downstream consumers, and who cleans up partial or malformed deliveries? Until those questions have disciplined answers, the bucket is only a file pile.
A useful lake usually starts with boring rules rather than grand architecture. Prefix conventions, retention policy, immutable raw landing, and ownership tags do more to keep a lake usable than a slide deck about lakehouse modernization.
- Keep raw landing predictable: one source or feed should have a clear prefix, container, or table location that teams can explain without guesswork.
- Separate raw from curated zones: even if they share the same object store, consumers should know whether they are reading a recovery surface or a reusable interface.
- Prefer stable file formats: Parquet, Avro, and other structured formats are easier to reason about than uncontrolled CSV sprawl.
- Make ownership visible: every durable dataset should have a team that can answer freshness, schema, and retention questions.
Table Formats Change the Lake Contract
One reason data lakes stayed painful for years is that plain files do not provide strong table semantics by themselves. A folder of Parquet files might look like a table, but readers still need a stable answer to questions such as which files belong to the latest snapshot, which schema version is current, and what happens when compaction rewrites data.
Open table formats such as Delta Lake, Iceberg, and Hudi exist to close that gap. They add transaction-log or manifest-style metadata so the lake behaves more like a real table system and less like a polite agreement about folders.
Storage shapeWhat it gives youWhat it still makes hardPlain files in object storageCheap retention, simple landing, many engines can read the formatSnapshot consistency, compaction discipline, and schema coordination are mostly your problemTable format over object storageStronger snapshot semantics, table versions, schema evolution support, and better coordination between writers and readersOperational complexity shifts into metadata maintenance, compaction, and engine compatibility
Skippr has a concrete public example here: the Delta Lake source reads a documented table_uri, accepts backend storage_options, and can optionally pin a version or apply a filter. That is a strong illustration of what changes once the lake contract is a table with log-backed semantics rather than just a path convention.
Even if you never use Delta Lake specifically, the general lesson holds: table formats make lakes more usable because they turn file collections into versioned data products.
Data Lakes, Warehouses, and Lakehouses: What Actually Changes
Teams often ask whether they should build a lake, a warehouse, or a lakehouse. The most useful answer is to compare the operational center of gravity.
SystemDefault center of gravityStrengthsUsual pressure pointData lakeStorage-first, file and table layout on object storageCheap retention, mixed data types, engine flexibility, raw fidelityMetadata discipline, file management, and consumer contractsCloud warehouseManaged SQL tables with strong built-in semanticsGoverned analytical interfaces, performance tooling, easier consumer experienceStorage and compute economics can be less flexible for raw multi-shape retentionLakehouse platformLake storage plus stronger table semantics and warehouse-like access patternsObject storage flexibility with better table behavior and multiple compute surfacesPlatform complexity and cross-engine behavior still need careful operating discipline
The right question is not which term sounds most modern. It is where you want the long-lived contract to sit. If the system needs cheap raw retention and multiple engines, a lake or lakehouse may be a strong base. If the system mostly needs stable SQL-facing business data, a cloud warehouse may be the cleaner core and the lake may stay a lower-level landing zone.
That is also why this guide does not replace The Ultimate Guide to Cloud Data Warehouses. Warehouses optimize around managed analytical interfaces. Lakes optimize around storage-first flexibility. Some teams need both.
Ingestion into a Lake: Landing, Checkpoints, and Replay
Lakes are often the first place teams notice whether their ingestion design is honest. If the landing pattern is weak, the lake preserves the weakness at scale.
For file and object-store inputs, the design questions are about prefixes, immutability, arrival tracking, and schema inference. For database and CDC-style inputs landing into lake storage, the harder question is how raw mutation truth, checkpoints, and final-state views will be represented without hiding correctness problems under a pile of parquet files.
- Batch landing needs arrival discipline: know which file batches have been committed, which are partial, and how reruns avoid double loading.
- Incremental landing needs durable progress: a watermark or offset only helps if it advances after committed output, not before.
- CDC in a lake needs explicit state design: append-only change history and consumer-friendly latest state are different contracts and should not be blurred together.
- Replay value matters: a good raw zone lets engineers explain what arrived and reprocess it without inventing the past again.
Use one concrete example. A Delta table pinned at version 5 is a stable reprocessing point because the table format exposes that version directly. A loose S3 prefix scan is weaker unless the team also has an explicit rule for which keys belong to the same batch and when the batch becomes durable enough to treat as committed history.
Schema Evolution in Lakes Is an Operating Problem, Not a Parser Trick
Lakes are attractive partly because they tolerate messy source data more easily than tightly modeled warehouse tables. That tolerance is useful, but it can also hide bad operating habits.
A source export adds a new nested tax_details object. A product event changes price from an integer to a string for one region. A partner feed starts delivering arrays where a scalar used to live. None of those changes are unusual. The engineering question is whether the lake makes the change visible, preserves the old interpretation, and gives downstream models a safe place to adapt.
Healthy lakes prefer additive evolution and visible schema change over silent destructive rewrites. That is why table formats, metadata catalogs, and strong raw landing practices matter. A lake does not remove schema drift. It only gives you better places to manage it.
- Additive fields are usually easy: preserve them in raw data and let reusable models adopt them deliberately.
- Incompatible type shifts need visibility: silently treating old and new values as the same field usually creates harder downstream cleanup later.
- Nested changes deserve first-class handling: most real drift problems are structural, not just scalar.
- Published outputs should absorb drift later than raw landing: the lowest layer should stay honest about what the source actually emitted.
That is one reason schema drift pairs so naturally with lake design. A good lake keeps the change visible long enough for engineers to choose the right semantic fix instead of forcing one hurried cast directly into a public-facing mart.
Partitions, File Size, and Metadata Decide Whether Queries Stay Cheap
Data lake performance problems are often self-inflicted. The storage is cheap, but reading it is only cheap when the file layout and metadata let engines skip most of the lake.
- Too many tiny files: engines spend more time listing and opening objects than reading useful data.
- Over-partitioning: a partition key that explodes into millions of small folders feels clever until metadata operations become the bottleneck.
- Under-partitioning: if every query still scans giant date ranges or full history, object storage cost savings vanish quickly.
- Stale metadata: catalogs and manifests that lag behind the real files make consumers distrust the lake.
- Unclear compaction policy: if nobody owns rewriting and cleanup, the lake accumulates layout debt every week.
A practical rule is to choose partitioning for the way data will be filtered most often, not for the most detailed dimension available. Daily event data usually benefits from date-oriented pruning far more than from partitioning by low-cardinality marketing attributes or by near-unique IDs.
Another practical rule is to treat file size as part of the data product contract. You do not need one magic number, but you do need a deliberate range that keeps engines efficient and compaction predictable.
Governance and Ownership Matter More Than Cheap Storage
Cheap storage makes it easy to keep data. It does not make that data understandable, discoverable, or safe to depend on.
Governance concernWhat a healthy lake doesDataset discoverabilityUses catalog entries, naming conventions, and ownership metadata so teams can find the right table or prefix quicklyAccess controlMakes bucket, container, table, and query-layer permissions deliberate instead of inherited accidentsRetention and deletionDefines what raw data is kept, for how long, and which layers may be compacted or expiredConsumer trustSeparates raw, reusable, and published contracts so analysts do not have to guess which tables are safe
Data lakes go bad when ownership stays fuzzy. A powerful engine on top of unowned storage is still unowned storage. Someone has to decide whether a dataset is a raw landing surface, a reusable technical table, or a published analytical interface.
A Worked Example: Product Events and Billing Data on an AWS-Shaped Lake
Use one realistic lake to make the design concrete. Imagine a SaaS company with product events landing continuously, Stripe exports dropped daily, and internal account data periodically synced for analysis.
- Raw product events land as Parquet under
s3://company-lake/raw/product_events/date=2026-06-10/. - Billing exports arrive as CSV under
s3://company-lake/raw/stripe_exports/load_date=2026-06-10/. - A curated Delta table at
s3://company-lake/curated/account_activitytracks reusable account-level state for more than one reader. - Glue catalog entries register the curated tables that should be discoverable through shared SQL.
- Athena provides one shared SQL surface over the cataloged part of the lake, while another engine can still read the raw event files or Delta table directly. Lake zone or contractExample assetWhy it lives thereRaw file zone
raw/product_events,raw/stripe_exportsPreserves arrival truth, file lineage, and replay valueTable-format zonecurated/account_activityas a Delta tableGives multiple readers one stronger snapshot and schema contract without pretending every dataset needs the same file shapeCatalog and query boundaryGlue metadata plus Athena tables over the curated part of the lakeLets SQL users discover the stable part of the lake without making raw prefixes a public interface
This example works because each piece answers a different question. Raw prefixes answer what arrived. The Delta table answers what the reusable snapshot looks like. The Glue plus Athena layer answers what part of the lake is safe for shared SQL. Another engine can still read the underlying storage without forcing every consumer into the same interface. If those contracts were collapsed into one folder naming trick, the architecture would get fragile quickly.
When a Data Lake Is the Right Foundation
Data lakes are a strong choice when the storage-first benefits outweigh the extra operating discipline.
- You need cheap long-term retention: raw history, files, events, and semi-structured data are expensive to keep only in tightly managed warehouse tables.
- You need multiple engines or readers: one team may want SQL while another wants Spark-style processing or a table-format-native workflow.
- You want to preserve raw source fidelity: the system needs a strong recovery and replay surface before heavy modeling begins.
- You have mixed data shapes: logs, files, nested payloads, and structured extracts all need a common storage home.
- You want late binding between landing and consumer interfaces: some datasets can remain raw files while others get promoted into stronger table-format or catalog contracts.
- You can support the operating model: someone will own catalogs, layout, permissions, compaction, partition evolution, and consumer contracts.
Those conditions are why lakes often show up beneath medallion-style architectures, machine-learning workflows, and multi-engine analytics estates. The lake is less about fashion and more about what kinds of data and workloads need to coexist.
When a Data Lake Is the Wrong Foundation
Data lakes are often chosen for flexibility when the workload actually needs stronger managed semantics.
- The primary consumers are SQL analysts who need stable governed tables: a cloud warehouse may provide the cleaner day-to-day experience.
- The team does not want to own storage layout and metadata discipline: cheap storage is not cheap if nobody maintains catalogs, file sizing, and partition rules.
- The workload is small and stable: a few clean relational tables rarely need a full lake operating model.
- The lake is being used to postpone data modeling indefinitely: raw retention is useful, but indefinite semantic ambiguity is not.
- You need one tightly managed interface rather than several contracts: if files, table formats, catalogs, and query engines all feel like extra burden, the lake may be the wrong center of gravity.
- Security and publication boundaries need to be very tight: warehouses often make controlled consumer access simpler than governing raw storage plus query surfaces separately.
A lake is not automatically the mature answer. Sometimes it is the place teams hide decisions they still need to make about contracts, ownership, and semantics.
Common Data Lake Failure Patterns
The failure patterns are recognizable.
- Cheap storage, expensive confusion: the lake retains everything but explains nothing.
- No difference between raw and curated data: consumers query unstable landing zones and then blame the engine.
- Too many tiny files: metadata and listing overhead dominate query time.
- Partitioning by habit instead of query reality: the lake layout reflects guesswork rather than access patterns.
- Catalog drift: files, manifests, and discovered tables disagree about what exists.
- Shared SQL pointed at the wrong boundary: Athena or another SQL engine is aimed at raw prefixes instead of a deliberate cataloged interface.
- No owner for compaction or cleanup: file-layout debt grows until the lake feels slow and unpredictable.
- Lakehouse language without contracts: the platform sounds modern, but nobody can say which datasets are reusable versus merely landed.
The common thread is not technology failure. It is operating-model failure. The lake is easier to create than to steward.
How Skippr Fits a Practical Lake Architecture
Skippr fits best where the lake boundary is real and explicit rather than hypothetical. The public connector docs show several concrete places it can help.
- S3 as a source boundary: the S3 source scans a configured bucket and optional prefix, can namespace incoming events from selected fields, and auto-detects JSON, CSV, TSV, Parquet, and Avro files.
- Delta Lake as a source boundary: the Delta connector reads one documented
table_uri, uses backendstorage_options, and can pin a version or apply a filter when the table contract needs a precise slice. - Athena as a SQL query surface: the Athena destination uses a workgroup, region, result S3 location, and schema, with access to S3, Glue, and Athena resources as the real operating prerequisites.
- Cloud object-store handoffs: GCS and Azure Blob destinations write Parquet files into a selected bucket or container when the right contract is storage delivery rather than shared SQL.
- Generated modeling path where it belongs: when the target is a SQL-facing analytical destination, Skippr follows the public discover, sync, model, validate flow and generates the dbt project as standard files you can inspect and extend.
Athena is not the lake itself. It is one SQL surface over lake storage plus metadata. That distinction matters because the storage contract, the query surface, and any object-store handoff should stay separately understandable.
That matters because many lake projects break at the handoff between raw storage and usable analytical interfaces. Skippr is useful in that gap: it can read the lake boundary honestly, keep deterministic schema handling and landing behavior visible, and move into ordinary modeling artifacts instead of forcing the team to trust a black box.
The data boundary also stays explicit. Your data stays within your system and in your destination. That is particularly useful for lake-shaped environments where raw data retention and access control are already under scrutiny.
For related reading, pair this guide with The Ultimate Guide to Data Ingestion, The Ultimate Guide to Cloud Data Warehouses, The Ultimate Guide to the Medallion Data Architecture, and the connector docs for S3, Delta Lake, Athena, GCS, and Azure Blob Storage.
Your Practical Data Lake Checklist
If you want one sequence to keep open while designing the lake, use this one.
- Define the lake as a contract system: raw landing, reusable tables, and published query surfaces should not blur together.
- Choose the storage layer deliberately and make naming, prefixes, and ownership visible from the first week.
- Decide whether plain files are enough or whether a table format should own snapshot and schema semantics.
- Treat metadata, catalogs, and engine access as first-class parts of the architecture, not optional extras.
- Decide which datasets stay raw files, which get promoted into a table format, and which get cataloged for shared SQL access.
- Design landing, checkpoint, and replay behavior so the lake preserves what arrived and when it became durable.
- Plan for schema evolution, file sizing, partitions, compaction, and catalog repair before the lake gets large enough to punish neglect.
- Separate cheap retention from consumer trust: not every file path should be a public analytical interface and not every SQL engine should point at raw landing.
- Choose a lake because the workload benefits from storage-first flexibility, not because the term sounds more modern than warehouse.
That is how strong data lakes stay useful. First make the contracts explicit. Then keep storage, metadata, and consumer discipline aligned as the system grows.
