Data Lakes vs. Data Lakehouses: Which to Use and When
Data lakes solved the volume and variety problem, but created a new one: a lack of reliability. Here's how lakehouses close that gap, and how to decide whether your team actually needs one.
Any company that moves from handling a few gigabytes in an ERP to ingesting application logs, clickstream events, CRM exports, and third-party files eventually hits the same wall: the traditional data warehouse wasn't built for this. It's optimized for structured data modeled in advance, and every new source demands a full schema-design cycle before a single record can be loaded. When volume grows fast and formats vary (JSON, Parquet, CSV, images, free text), that cycle becomes the bottleneck that slows down the entire data team. The real problem isn't "where do we store the data," but how to keep storing everything from turning into an unusable mess down the line. That's where data lakes, and more recently data lakehouses, come in.
What a data lake is
A data lake is a centralized repository that stores data in its native format, without requiring it to be structured or modeled before ingestion. The core idea is simple: store first, decide how to use it later. This works by relying on cheap, elastic object storage (blob storage or distributed file systems), where any kind of data — structured, semi-structured, or unstructured — coexists in the same repository.
The goal of a lake isn't to serve a specific report, but to make the organization's entire universe of available data accessible so that different teams (analysts, data scientists, ML engineers) can explore and use it however they need, without depending on IT to design a table for every use case. That's why lakes are usually organized into zones with different levels of curation: a raw zone with data exactly as it arrives, a clean/standardized zone, and a curated zone ready for consumption — each with its own access and governance rules.
Where the lake's promise breaks down
The object storage underlying a data lake was designed to write and read large files efficiently, not to behave like a database. That difference in design produces three concrete problems as soon as a lake starts being used in earnest:
- No transactions. Without ACID guarantees, two processes writing to and reading from the same folder at the same time can step on each other. Combining batch and streaming processing over the same data is, in practice, almost impossible to do safely.
- No schema control. Since there's no layer validating what structure the data has, nothing stops a change at the source (a column that disappears, a type that changes) from silently breaking downstream processes.
- Basic database operations are expensive. Deleting a single record, applying an upsert, or running a merge means rewriting entire files, because object storage doesn't support partial modifications.
The result, when these problems go unmanaged, has its own name in data jargon: data swamp, a lake with no governance where nobody trusts what's inside. The practical consequence is that many companies ended up keeping the lake for raw data and a separate warehouse for anything that needed reliability — duplicating pipelines, costs, and latency between the two systems.
What a lakehouse adds
A lakehouse isn't a new storage technology — it's a transactional management layer that sits on top of the same cheap object storage a lake already uses. Open table formats like Delta Lake, Apache Iceberg, or Apache Hudi maintain a metadata log that tracks exactly which files make up each version of a table, and it's that layer that enables everything else:
- ACID transactions directly on object storage, so multiple pipelines can read and write concurrently without corrupting the data.
- Schema enforcement and evolution, so an unexpected change at the source doesn't silently break tables, and so that change can be incorporated in a controlled way.
- Unified batch and streaming on the same set of tables, with no need to maintain two copies of the data or two separate architectures.
- SQL and BI queries directly on the lake, removing the need to move data into a separate warehouse just so an analyst can query it with low latency.
A lakehouse doesn't replace the data lake — it adds the transactional discipline a warehouse always had, without giving up the flexibility and cost profile of open object storage.
Layered organization: from raw to trustworthy
The most common way to organize a lakehouse today is the so-called medallion architecture, which is really just a naming convention for progressively improving data quality as it moves through the pipeline:
- Bronze (raw): data lands exactly as it arrives from the source, untransformed. The goal at this layer is for ingestion to never fail: if something arrives in an unexpected format, it's still stored and handled later, instead of stopping the whole pipeline.
- Silver (cleaned/conformed): deduplication, null handling, resolution of late or out-of-order data, and quality validation are applied here. There's still no business logic at this layer — it's a clean, trustworthy version that stays faithful to the source.
- Gold (curated): dimensional modeling (star or snowflake schemas) is applied, along with an optional semantic model for BI tools. This is the layer business analysts and production dashboards consume.
Worth clarifying something that often gets lost: bronze/silver/gold is a design pattern, not a mandatory architecture or a standard. Each organization adjusts the number of layers and their rules based on its volume, regulatory requirements, and data maturity.
| Data lake | Data lakehouse | |
|---|---|---|
| Transactions | No ACID guarantees | ACID via a transactional metadata layer |
| Schema control | None; schema validated on read, if at all | Schema enforcement and evolution on write |
| Updates/deletes/merges | Expensive; require rewriting entire files | Natively and efficiently supported |
| Batch + streaming | Hard to combine over the same data | Unified on the same set of tables |
| BI/SQL querying | Requires copying data to a separate warehouse | Direct, on the lakehouse itself |
| Typical risk | Data swamp if governance is missing | Operational complexity if oversized |
When to actually use each one
A plain data lake is still good enough when the use case doesn't demand strong transactional consistency. Concretely, it works well when:
- Data is mostly read-only or append-only, with no need to update or delete individual records (for example, log files or historical events used to train models).
- There's a single pipeline, or a small number of consumers writing at the same time, without real concurrency that would expose the lack of transactions.
- The main goal is ad hoc exploration and analysis of raw data, not serving production reports with SLAs around freshness or accuracy.
- Budget and team size are small, and adding a transactional layer (Delta, Iceberg, Hudi) would introduce more operational complexity than the project can sustain right now.
It's worth investing in a lakehouse once any of these signals show up:
- You need to apply selective deletes or updates to data that's already stored — for example, to comply with personal data deletion requests, or to process CDC (change data capture) from transactional databases.
- Multiple processes read and write the same tables concurrently, and you've already run into (or expect) data corruption or inconsistency because of that concurrency.
- You want BI, data science, and machine learning to work on the same copy of the data, instead of keeping synchronized duplicates between a lake and a warehouse.
- Your source schemas change fairly often, and you need those changes controlled and evolved without silently breaking downstream pipelines.
If you're still not sure whether you need a lakehouse, start with a well-governed, layered lake (bronze/silver/gold) with clear naming conventions anyway. Migrating those same tables to a transactional format like Delta or Iceberg later on is an incremental change, not an architecture rewrite.
The decision isn't binary forever: most teams start with a simple lake and adopt lakehouse guarantees as concurrency, the need to update data, or governance requirements justify it. What you want to avoid is taking on transactional complexity before you need it — or putting it off until the lake has already turned into a swamp nobody wants to touch.