Table of Contents

Data infrastructure has taken a winding path over the last decade. Data warehouses dominated, then data lakes emerged as a cheap way to store massive amounts of raw data — only to create years of headaches around governance and query performance. The Data Lakehouse is the architecture pattern trying to end that tug-of-war: the same storage layer delivers both data warehouse reliability and data lake flexibility.

TL;DR

  • Data Warehouse: structured, high-performance, high-cost; schema-on-write makes schema changes painful
  • Data Lake: low cost, flexible; but lacks ACID, hard to govern, slow queries
  • Data Lakehouse: adds an open table format on top of object storage (S3/GCS), getting the benefits of both
  • Main implementations: Apache Iceberg (cross-engine interop) and Delta Lake (Databricks-ecosystem-first)
  • 2025 trend: Delta Lake UniForm enables both formats to be read by the same engine — “write once, read anywhere”

What Is It

A Data Lakehouse is an architectural pattern, not a specific software product. The core idea:

Layer a transactional metadata format on top of open-format object storage.

The traditional approach runs data lakes and data warehouses in parallel, with ETL pipelines moving data between them — introducing latency and consistency problems. Lakehouse collapses this into a single layer: data lives in Parquet or ORC files on S3/GCS/ADLS, and open table formats like Apache Iceberg or Delta Lake provide ACID semantics, time travel, and schema evolution on top.

graph LR
    A[Data Sources] --> B[Object Storage S3 / GCS]
    B --> C[Open Table Format Iceberg / Delta Lake]
    C --> D[Metadata and Transaction Log]
    C --> E[Spark]
    C --> F[Trino / Presto]
    C --> G[Snowflake]
    C --> H[BigQuery]
    D --> I[ACID Transactions]
    D --> J[Time Travel]
    D --> K[Schema Evolution]

Why It Matters

Data warehouses suffer from cost and flexibility problems: most cloud warehouses couple compute and storage, making scaling expensive; strict schema requirements make ML and AI workloads difficult to accommodate.

Data lakes suffer from reliability problems: no ACID transactions means concurrent writes can corrupt data; no schema validation means data quality is hard to guarantee; small-file proliferation periodically requires manual maintenance to restore query performance.

Lakehouse solves:

  • Cost: data stays in cheap object storage; compute is on-demand
  • ACID: table format transaction logs ensure atomicity
  • Multi-engine: one copy of data can be read simultaneously by Spark, Trino, Snowflake, DuckDB
  • ML/AI-friendly: unstructured and semi-structured data can coexist with structured data

How It Works

Taking Apache Iceberg as an example, its metadata layer has three tiers:

  1. Metadata files: record table schema, partition spec, and snapshot history
  2. Manifest lists: each snapshot maps to a manifest list recording which data files belong to it
  3. Manifest files: record the path, row count, and statistics (min/max values) of each Parquet data file

Query engines walk Metadata → Manifest list → Manifest files before scanning, using statistics for partition pruning and file pruning — dramatically reducing the data that needs to be scanned. This design also enables atomic table version switching across engines without a centralized lock manager.

Delta Lake’s architecture is similar but more Spark-centric: a _delta_log/ directory at the table root stores JSON-format transaction records, with Parquet checkpoints generated every 10 versions for faster loading.

Compared to Data Warehouses and Data Lakes

DimensionData WarehouseData LakeData Lakehouse
Storage formatProprietaryOpen (Parquet/ORC)Open format
Storage costHighLowLow
ACID transactionsYesNoYes (via table format)
SchemaStrict (write-time)Flexible (read-time)Evolvable
Multi-engine accessDifficultEasyEasy
StreamingLimitedDifficultSupported (Iceberg v2+)
ML/AI workloadsDifficultConvenientConvenient

Apache Iceberg vs Delta Lake

Apache IcebergDelta Lake
OriginNetflix → Apache Software FoundationDatabricks → Linux Foundation
Design focusCross-engine interop, large-scale partitioningSpark performance, DML simplicity
CatalogMultiple (Hive, Nessie, REST)Primarily Unity Catalog
Engine supportSnowflake, Dremio, BigQuery, FlinkPrimarily Databricks, Spark
Format interopIceberg v3 can read DeltaDelta UniForm publishes Iceberg metadata

The 2025 convergence trend: Delta Lake’s UniForm feature lets a Delta table simultaneously expose Iceberg-compatible metadata, so any Iceberg-capable engine can read it as if it were native. Write in Delta, read from Snowflake — “write once, read anywhere.”

Summary

The Data Lakehouse is no longer a concept — it’s the default starting point for most data engineering teams designing new systems in 2025. Choosing between table formats:

  • Primarily Databricks ecosystem → Delta Lake
  • Need multi-engine interop (Snowflake + Spark + Trino) → Apache Iceberg
  • Want both → Delta UniForm or Iceberg with a multi-engine catalog

Regardless of which you pick, the underlying principle is the same: put reliability in the metadata layer, leave flexibility and low cost in object storage.

References

Ask this article

Answers come from this article only. Click any prompt below or open the chat at the bottom right.

🇺🇸 English

Data infrastructure has taken a pretty winding road over the last decade. First, data warehouses ruled everything. Then data lakes showed up as a cheap way to dump massive amounts of raw data — and they solved the cost problem, sure, but they handed us years of headaches around governance and slow queries. The Data Lakehouse is the architecture that's trying to end that tug-of-war once and for all. The pitch is simple: one storage layer that gives you warehouse-grade reliability *and* data-lake flexibility, at the same time.

So let's set the stage with the three players.

A data warehouse is structured, fast, and reliable — but it's expensive, and it uses what's called schema-on-write, which basically means you lock in the structure up front. Great for consistency, painful the moment you need to change that schema.

A data lake flips that. It's cheap and flexible, you can throw anything into it — but it lacks ACID transactions, it's hard to govern, and queries tend to crawl.

The Data Lakehouse takes the best of both. You keep your data in cheap object storage, like Amazon S3 or Google Cloud Storage, and then you layer an *open table format* on top of it. And that table format is where the magic happens.

Now, here's a key point: a Data Lakehouse is not a product you buy. It's an architectural pattern. The core idea in one sentence — you put a transactional metadata format on top of open-format object storage.

Think about the old way of doing things. You ran a data lake and a data warehouse side by side, and you had ETL pipelines constantly shuffling data between them. That means latency, and it means consistency problems, because now you've got two copies that can drift apart. The Lakehouse collapses all of that into a single layer. Your data lives as Parquet or ORC files sitting in object storage, and an open table format — the two big names are Apache Iceberg and Delta Lake — gives you ACID guarantees, time travel, and schema evolution right on top of those files.

Picture the flow like this: your data sources feed into object storage. On top of that storage sits the open table format. That format maintains a metadata and transaction log, and *that's* what delivers the three headline features — ACID transactions, time travel so you can query previous versions of a table, and schema evolution so you can change structure without breaking everything. And because it's all open, a whole crowd of query engines — Spark, Trino, Snowflake, BigQuery — can read the exact same copy of the data.

So why does any of this actually matter? Let's talk about the pain points it fixes.

Data warehouses hurt on cost and flexibility. Most cloud warehouses tie compute and storage together, so scaling gets expensive fast. And their strict schema requirements make machine learning and AI workloads a real struggle to fit in.

Data lakes hurt on reliability. No ACID means concurrent writes can literally corrupt your data. No schema validation means data quality is anyone's guess. And you get this endless small-file problem, where files pile up and you periodically have to do manual cleanup just to keep queries fast.

The Lakehouse addresses all of that. On cost, your data stays in cheap object storage and you spin up compute only when you need it. On reliability, the table format's transaction log guarantees atomic writes. On flexibility, one copy of the data can be read by Spark, Trino, Snowflake, DuckDB — all at once. And it plays nicely with ML and AI, because unstructured and semi-structured data can live right alongside your clean structured tables.

Okay, so how does it actually work under the hood? Let's use Apache Iceberg as our example, because its metadata layer is a nice clean three-tier design.

At the top, you've got metadata files. These record the table's schema, how it's partitioned, and the full history of snapshots. Below that are manifest lists — every snapshot points to a manifest list that says which data files belong to that particular version of the table. And then at the bottom are the manifest files themselves, which track each individual Parquet data file: where it lives, how many rows it has, and crucially, statistics like the minimum and maximum values in that file.

Here's why those statistics are the secret sauce. When a query engine runs, it walks down that tree — metadata, then manifest list, then manifest files — *before* it touches any actual data. Using those min/max stats, it can skip entire partitions and entire files that couldn't possibly match your query. That's called partition pruning and file pruning, and it dramatically cuts down how much data actually gets scanned. This same design also lets you switch table versions atomically across different engines, without needing some central lock manager coordinating everyone.

Delta Lake works on a similar principle, but it's more Spark-centric. At the root of a Delta table there's a folder called `_delta_log`, and it stores transaction records as JSON. Then, every ten versions, it writes out a Parquet checkpoint so engines can load the state faster instead of replaying every single change from the beginning.

Now let's compare the two formats head to head, because this is the choice most teams actually agonize over.

Apache Iceberg came out of Netflix and is now an Apache Software Foundation project. Its whole design philosophy is cross-engine interoperability and handling really large-scale partitioning. It supports lots of catalogs — Hive, Nessie, REST — and it's read by a broad lineup of engines: Snowflake, Dremio, BigQuery, Flink.

Delta Lake came out of Databricks and now lives under the Linux Foundation. Its focus is Spark performance and making data manipulation — inserts, updates, deletes — really simple. Its catalog story centers on Unity Catalog, and its engine support is primarily Databricks and Spark.

And here's the really interesting development — the two formats are converging. In 2025, the big trend is Delta Lake's UniForm feature. What UniForm does is let a Delta table simultaneously expose Iceberg-compatible metadata. So any engine that speaks Iceberg can read that Delta table as if it were native Iceberg. You write your data in Delta, and you read it from Snowflake. The slogan is "write once, read anywhere." Iceberg's moving the same direction too — its version three can read Delta. The walls between these two are coming down.

So how do you actually choose? It comes down to your ecosystem. If you're mostly living in the Databricks world, go with Delta Lake. If you need real multi-engine interop — Snowflake plus Spark plus Trino all reading the same data — go with Apache Iceberg. And if you genuinely want both worlds, that's exactly what Delta UniForm, or Iceberg paired with a multi-engine catalog, is there to give you.

Let me leave you with the three things worth remembering.

First: the Data Lakehouse isn't a concept anymore, it's the default starting point. If a data team is designing a new system today, this is where they begin — no more running a lake and a warehouse in parallel and syncing between them.

Second: the whole architecture rests on one simple principle. Put reliability in the metadata layer, and leave flexibility and low cost down in the object storage. That separation is the entire trick.

And third: for the format choice, don't overthink it. Databricks shop, pick Delta. Multi-engine future, pick Iceberg. And thanks to UniForm and the convergence happening right now, that decision is getting less permanent — and less scary — by the year.

🇹🇼 中文

什麼是 data lakehouse?它跟 data lake、data warehouse 到底差在哪?要講清楚這個問題,得先看懂 lakehouse 想取代的是哪兩套系統,還有它們湊在一起時會生出什麼麻煩。

先講第一套:data warehouse,資料倉儲。它裝的是已經整理乾淨、可以直接拿來分析的資料。它通常支援 ACID transaction,而且針對快速的 SQL 查詢做過最佳化。比方說財務團隊要拉每天精準的營收報表,靠的就是它。

第二套:data lake,資料湖。它用的是便宜的物件儲存,可以用超大的規模去堆原始的、半結構化、甚至完全非結構化的資料。像資料科學團隊會把幾百萬筆點擊紀錄整包丟進去,拿來訓練機器學習模型。

所以一邊是「乾淨、可靠、可查詢」,另一邊是「便宜、海量、什麼都能塞」,各有各的定位,本來各司其職。

問題就出在——把這兩套系統擺在一起用的時候。

拿一個很忙的電商平台當例子。它會不斷產生有價值的資訊:原始的訂單事件、付款紀錄、客服日誌。典型的做法是,原始檔案先落地到物件儲存,變成 data lake;同時,整理過、拿來分析的資料表,放在另外一套獨立的 data warehouse 裡。

平台小的時候,這樣跑沒問題。但一旦成長起來,關鍵的痛點來了:每一次 schema 變更,都會同時牽動兩條資料進來的路徑、兩套品質檢查、兩種存取模型。結果就是資料工程師花了大把時間,只是在讓這兩套系統互相同步,而不是在打造新的資料產品。

Data Lakehouse 就是為了解掉這件事而生的架構。它的目標是:維持一個共享的資料層,同時保有倉儲的可靠性,跟資料湖的規模。

而 lakehouse 不是某個單一產品,它是把幾個元件一層一層疊起來的架構。我們從最底層開始蓋。

最底下,第一層,是單一的物件儲存層。以那個電商團隊來說,原始訂單事件、跟整理後的分析資料表,現在都放在同一個物件儲存上。處理完原始資料,就把整理好的結果用最佳化的檔案格式,像 Parquet,寫回同一個地方。這樣做,就把系統之間反覆複製資料的成本給砍掉了。物件儲存高可用、耐久,要擴充也便宜。

但它有個根本的限制:它只是在存原始檔案,它根本不知道什麼叫「資料庫表格」。這會出兩個問題。第一,如果一個寫入工作跑到一半掛掉,讀取端可能看到一張不完整、不一致的表。第二,如果有人趁別人正在寫的時候去讀,可能只讀到更新的一半。所以我們需要一個辦法,直接在這些檔案上面,把類似資料庫的規則加回來。

這就帶到第二層:open table format,開放表格格式。像 Apache Iceberg、Delta Lake、或 Apache Hudi 都是。它們不直接把原始檔案暴露出去,而是維護一份 table metadata、快照、還有提交歷史。它帶來兩個關鍵保證。第一是原子性:每一次寫入,不是完全成功、就是完全失敗,就算有並行更新,讀的人永遠看到一致的畫面。第二是 schema 演化:很多 schema 變更被當成 metadata 操作來處理。比方你要改一個欄位名稱,往往只要更新一下表格定義就好,不需要把歷史上那一大堆檔案整批重寫。到這裡,我們已經有可靠的資料表了。

但有了可靠的表,下一個問題是:不同的工具,怎麼「找到」這些表?這需要第三層,共享的 catalog。catalog 做的事,是把一個表名,比方 orders,對應到它的 metadata、schema、跟目前的版本。任何工具想讀或想寫,都先問 catalog:「最新版本在哪?」這就形成了單一事實來源。舉個例子,你可能用 Apache Spark 這種重量級引擎去灌進幾百萬筆新訂單,同時用 Trino 這種快查詢引擎去撐一個儀表板。因為兩邊查的是同一個 catalog,所以 Trino 立刻就能看到 Spark 剛剛提交進去的新紀錄。

最上面,第四層,是治理層。有了共享的 metadata,接下來是團隊規模一大就會浮現的治理問題:到底有哪些資料集存在?它們是從哪來的?還有最關鍵的——究竟誰可以讀像付款這種敏感欄位?像 AWS Lake Formation、或 Databricks Unity Catalog 這類工具,就提供一個集中的地方來管這些規則,而且可以鎖到特定欄位的存取。

這裡有個很好記的分法:如果說 table format 負責確保資料是正確的,那治理層就是負責確保資料是安全的。很多團隊還會再用 cloud security,把底層那個物件儲存本身也鎖起來。

把這四層從下往上串一次:最底層物件儲存,提供便宜的規模;往上一層 open table format,把資料庫級的可靠性加回來;再往上共享 catalog,讓不同引擎看到同一份真相;最上面治理層,決定資料安不安全、誰能碰。而 Spark 跟 Trino 這些引擎,都是透過查詢那個共享 catalog 來接進這整套架構。

最後收個尾,講三個重點。第一,data lakehouse 的核心不是什麼神奇的產品,它是一種疊法:把可靠性收斂到 table format 跟 catalog,把海量跟低成本留給物件儲存,再用治理層把安全鎖上。第二,它真正解掉的痛點,就是電商那個例子裡「維護兩套系統同步」的無底洞——當原始資料跟分析資料表共用同一層儲存、共用同一個 catalog,schema 變更就不用在兩條路徑上各做一次。第三,也是最實在的一點:省下來的那些同步時間,工程師終於可以拿回去,做真正該做的事——打造新的資料產品。

Tags

Related Articles

RAG's Five Stages: From Pipeline to Reasoning Retrieval, and the Naive RAG on My Own Site

Over the past two years RAG evolved from a 'linear pipeline' to 'loop-based reasoning'. It maps cleanly to five stages: Naive, Advanced, Modular, Graph, Agentic. The real inflection point is control moving from pipeline to agent — a System 1 → System 2 shift. Looking back at engineer-news's own RAG stack, it's stuck at the Naive edge — so this post also lays out what to fix next.

Building a Real RAG: 5 Infra Lessons from InfiniFlow's 2024 Year-in-Review

The previous post zoomed out for a five-stage panorama of RAG. This one zooms in on the five infra lessons any real RAG has to face: document ingestion, contextualized chunking, three-lane hybrid search, tensor reranker, and GraphRAG's semantic gap. Each lesson is checked against engineer-news's current stack, ending with a priority list for a personal site.