Home Database Data Lake vs Lakehouse: Delta Lake, Iceberg, Hudi Deep Dive
Advanced 3 min · July 13, 2026

Data Lake vs Lakehouse: Delta Lake, Iceberg, Hudi Deep Dive

Learn the differences between data lakes and lakehouses.

N
Naren Founder & Principal Engineer

20+ years shipping high-throughput database systems. Everything here is grounded in real deployments.

Follow
Production
production tested
July 13, 2026
last updated
2,165
articles · all by Naren
Before you start⏱ 20-25 min read
  • Basic understanding of SQL and data warehouses
  • Familiarity with Apache Spark or similar big data engines
  • Knowledge of Parquet file format
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer
  • Data lakes store raw data in cheap object storage but lack ACID transactions.
  • Lakehouses add ACID transactions, schema enforcement, and time travel on top of data lakes.
  • Delta Lake, Iceberg, and Hudi are open-source table formats that enable lakehouse architectures.
  • Choose based on ecosystem: Delta Lake for Spark-centric, Iceberg for multi-engine, Hudi for near-real-time upserts.
✦ Definition~90s read
What is Data Lake and Lakehouse?

A lakehouse is a data management architecture that combines the flexibility of a data lake with the reliability and performance of a data warehouse, using open table formats like Delta Lake, Iceberg, or Hudi.

Imagine a giant warehouse where you dump all your boxes (data) without any organization.
Plain-English First

Imagine a giant warehouse where you dump all your boxes (data) without any organization. That's a data lake. A lakehouse is like adding a librarian who catalogs every box, ensures no one messes with it while you're reading, and lets you travel back in time to see what was in a box yesterday. Delta Lake, Iceberg, and Hudi are different librarians with their own filing systems.

In the early days of big data, organizations built data lakes to store massive amounts of raw data cheaply on object storage like Amazon S3 or HDFS. However, data lakes suffered from a lack of ACID transactions, making it difficult to ensure data consistency, especially when multiple jobs write concurrently. They also lacked schema enforcement, leading to data corruption over time. The lakehouse architecture emerged as a solution, combining the low-cost storage of data lakes with the reliability and performance of data warehouses. At the heart of lakehouses are open-source table formats: Delta Lake, Apache Iceberg, and Apache Hudi. These formats add transactional metadata layers on top of Parquet files, enabling ACID transactions, schema evolution, time travel, and efficient upserts. This tutorial will dive deep into each format, compare their strengths, and provide production-ready examples. By the end, you'll understand how to choose the right format for your use case and debug common issues in production.

What is a Data Lake?

A data lake is a centralized repository that stores all your structured and unstructured data at any scale. You can store data as-is, without having to first structure it, and run different types of analytics—from dashboards and visualizations to big data processing, real-time analytics, and machine learning. Data lakes are typically built on low-cost object storage like Amazon S3, Azure Data Lake Storage, or HDFS. The key advantage is cost and flexibility. However, traditional data lakes lack ACID transactions, making it hard to ensure data consistency when multiple jobs write concurrently. They also lack schema enforcement, leading to data quality issues. For example, if a streaming job writes to a table while an analytics query reads it, the query might see partial writes or inconsistent data. This is where lakehouse formats come in.

data_lake_example.sqlSQL
1
2
3
4
5
6
7
8
-- Simulating a data lake write without ACID
-- This is a Spark SQL example on raw Parquet files
CREATE TABLE sales_data USING parquet LOCATION '/data/sales';
INSERT INTO sales_data VALUES (1, '2023-01-01', 100);
-- Another job overwrites the table
INSERT OVERWRITE sales_data VALUES (2, '2023-01-02', 200);
-- Query might see partial results if concurrent
SELECT * FROM sales_data;
Output
1 2023-01-01 100
2 2023-01-02 200
⚠ No ACID in Traditional Data Lakes
📊 Production Insight
In production, many teams use Hive-style partitioning with Parquet files, but they often encounter data corruption when multiple jobs write to the same partition. This is a common source of data quality incidents.
🎯 Key Takeaway
Data lakes are cheap and flexible but lack transactional guarantees, making them unsuitable for concurrent workloads.

What is a Lakehouse?

A lakehouse is a new, open architecture that combines the best elements of data lakes and data warehouses. It is built on low-cost object storage and uses a transactional metadata layer to provide ACID transactions, schema enforcement, and data versioning. This enables reliable data processing, including streaming and batch, with the performance of a warehouse. The core components are table formats like Delta Lake, Apache Iceberg, and Apache Hudi. These formats add a transaction log that records every change, allowing for snapshot isolation, time travel, and rollbacks. They also support schema evolution, so you can add or rename columns without rewriting the entire table. Lakehouses are ideal for modern data platforms that need to support BI, ML, and real-time analytics on a single copy of data.

lakehouse_example.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- Creating a Delta Lake table with ACID
CREATE TABLE sales_delta (
  id INT,
  date DATE,
  amount DECIMAL(10,2)
) USING delta LOCATION '/data/sales_delta';

INSERT INTO sales_delta VALUES (1, '2023-01-01', 100);
-- Concurrent insert
INSERT INTO sales_delta VALUES (2, '2023-01-02', 200);
-- Query sees consistent snapshot
SELECT * FROM sales_delta;

-- Time travel: see previous version
SELECT * FROM sales_delta VERSION AS OF 0;
Output
1 2023-01-01 100
2 2023-01-02 200
-- Time travel output:
1 2023-01-01 100
🔥Lakehouse Benefits
📊 Production Insight
When migrating from a data lake to a lakehouse, you can convert existing Parquet tables to Delta/Iceberg/Hudi using CONVERT TO DELTA or ALTER TABLE SET TBLPROPERTIES. This is a common migration path.
🎯 Key Takeaway
Lakehouses bring warehouse-like reliability to data lakes, enabling consistent data for analytics and ML.

Delta Lake: The Pioneer

Delta Lake is an open-source storage layer that brings ACID transactions to Apache Spark and big data workloads. It was developed by Databricks and is now part of the Linux Foundation. Delta Lake uses a transaction log (stored as JSON files in a _delta_log directory) to record every change. It supports schema enforcement, schema evolution, time travel, and unified batch/streaming. Delta Lake is tightly integrated with Spark, but also supports Presto, Trino, and Flink through connectors. Key features include: ACID transactions with serializable isolation, scalable metadata handling, and built-in data compaction (OPTIMIZE). Delta Lake is a good choice if your ecosystem is Spark-centric.

delta_lake_operations.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- Delta Lake specific operations
-- Convert existing Parquet to Delta
CONVERT TO DELTA parquet.`/data/sales`;

-- Schema evolution: add column
ALTER TABLE sales_delta ADD COLUMNS (region STRING);

-- Merge (upsert)
MERGE INTO sales_delta AS target
USING updates AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET target.amount = source.amount
WHEN NOT MATCHED THEN INSERT *;

-- Optimize (compact small files)
OPTIMIZE sales_delta;

-- Vacuum (clean up old files)
VACUUM sales_delta RETAIN 168 HOURS;
💡Delta Lake Best Practices
📊 Production Insight
Delta Lake's transaction log can become a bottleneck with many concurrent writes. Use partition pruning and avoid too many small transactions.
🎯 Key Takeaway
Delta Lake is the most mature lakehouse format with deep Spark integration and rich features like MERGE and OPTIMIZE.

Apache Iceberg: The Multi-Engine Champion

Apache Iceberg is an open table format designed for huge analytic datasets. It was developed at Netflix and is now an Apache top-level project. Iceberg's key strength is its engine-agnostic design: it works with Spark, Flink, Trino, Presto, Hive, and more. Iceberg uses a tree structure of metadata files (metadata.json, manifest lists, manifests) to track table snapshots. It supports ACID transactions with serializable isolation, schema evolution, hidden partitioning (partitioning is defined at table creation and automatically applied), and time travel. Iceberg's partition evolution allows you to change partitioning without rewriting data. It also supports row-level delete files for efficient updates and deletes. Iceberg is ideal for multi-engine environments.

iceberg_operations.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- Creating an Iceberg table
CREATE TABLE sales_iceberg (
  id INT,
  date DATE,
  amount DECIMAL(10,2)
) USING iceberg PARTITIONED BY (date);

-- Insert data
INSERT INTO sales_iceberg VALUES (1, '2023-01-01', 100);

-- Time travel
SELECT * FROM sales_iceberg FOR SYSTEM_TIME AS OF '2023-01-01 00:00:00';

-- Schema evolution
ALTER TABLE sales_iceberg ADD COLUMN region STRING;

-- Partition evolution (change partition spec)
ALTER TABLE sales_iceberg SET PARTITION SPEC (bucket(16, id));

-- Expire snapshots
CALL iceberg.system.expire_snapshots('default.sales_iceberg', TIMESTAMP '2023-01-02 00:00:00');
🔥Iceberg Hidden Partitioning
📊 Production Insight
Iceberg's metadata can become large with many snapshots. Regularly expire old snapshots to keep metadata manageable.
🎯 Key Takeaway
Iceberg is the best choice for multi-engine environments, with features like hidden partitioning and partition evolution.

Apache Hudi: The Near-Real-Time Upsert Specialist

Apache Hudi (Hadoop Upserts Deletes and Incrementals) is an open-source data management framework that provides upserts, incremental queries, and data compaction. It was developed at Uber and is now an Apache project. Hudi is designed for near-real-time data ingestion with low latency. It supports two table types: Copy-on-Write (CoW) and Merge-on-Read (MoR). CoW stores data in columnar files (Parquet) and rewrites files on upsert, while MoR uses a combination of columnar and row-based (Avro) files for faster writes. Hudi provides ACID transactions, time travel, and incremental queries (only new changes). It integrates with Spark, Flink, Presto, and Trino. Hudi is ideal for streaming ingestion with frequent upserts.

hudi_operations.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- Creating a Hudi table (Copy-on-Write)
CREATE TABLE sales_hudi (
  id INT,
  date DATE,
  amount DECIMAL(10,2),
  PRIMARY KEY (id) NOT ENFORCED
) USING hudi
OPTIONS (
  type = 'cow',
  precombine.field = 'date'
) PARTITIONED BY (date);

-- Insert data
INSERT INTO sales_hudi VALUES (1, '2023-01-01', 100);

-- Upsert (using merge)
MERGE INTO sales_hudi AS target
USING updates AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET target.amount = source.amount
WHEN NOT MATCHED THEN INSERT *;

-- Incremental query (get changes after a commit)
SELECT * FROM sales_hudi WHERE _hoodie_commit_time > '20230101000000';

-- Compaction (for MoR tables)
CALL run_compaction(table => 'sales_hudi', op => 'run');
⚠ Hudi Primary Key Requirement
📊 Production Insight
Hudi's Merge-on-Read tables can have read performance degradation due to log files. Schedule regular compaction to merge logs into columnar files.
🎯 Key Takeaway
Hudi excels at near-real-time upserts and incremental processing, making it ideal for streaming data pipelines.

Comparison: Delta Lake vs Iceberg vs Hudi

Choosing the right format depends on your use case. Here's a comparison: Delta Lake is best for Spark-centric environments with heavy batch processing; Iceberg is best for multi-engine environments with complex schemas; Hudi is best for near-real-time upserts and incremental processing. All three support ACID, time travel, and schema evolution. Delta Lake has the most mature ecosystem with Databricks support. Iceberg has the best engine compatibility. Hudi has the best upsert performance. In terms of metadata management, Iceberg uses a tree structure that scales well, while Delta Lake's transaction log can become a bottleneck. Hudi's metadata is more complex due to log files. For compaction, Delta Lake's OPTIMIZE is straightforward, Iceberg requires snapshot expiration, and Hudi requires separate compaction runs.

comparison_query.sqlSQL
1
2
3
4
-- Example of converting between formats (conceptual)
-- Delta to Iceberg: use Apache Spark with Iceberg connector
-- Iceberg to Hudi: rewrite using Hudi's bulk_insert
-- No direct conversion; requires rewriting data
💡Interoperability
📊 Production Insight
In production, you might use multiple formats for different use cases. For example, use Hudi for streaming ingestion and Iceberg for analytics queries.
🎯 Key Takeaway
Choose Delta Lake for Spark, Iceberg for multi-engine, Hudi for upserts. All are open-source and actively developed.

Production Best Practices

Running lakehouse formats in production requires careful configuration. For Delta Lake, set 'delta.enableChangeDataFeed = true' for CDC, and use 'delta.autoOptimize.autoCompact = true' to automatically compact small files. For Iceberg, configure 'write.metadata.metrics.default' to control column statistics, and set 'write.target-file-size-bytes' to avoid small files. For Hudi, tune 'hoodie.upsert.shuffle.parallelism' and 'hoodie.cleaner.policy' to manage file sizes. Always monitor the transaction log size and metadata overhead. Use partitioning wisely to avoid too many partitions (e.g., daily partitioning for date columns). Implement data retention policies using VACUUM (Delta), expire snapshots (Iceberg), or cleaner (Hudi). Test time travel and rollback procedures regularly.

best_practices.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
-- Delta Lake: enable auto compaction
ALTER TABLE sales_delta SET TBLPROPERTIES (
  'delta.autoOptimize.autoCompact' = 'true',
  'delta.targetFileSize' = '256mb'
);

-- Iceberg: set target file size
ALTER TABLE sales_iceberg SET TBLPROPERTIES (
  'write.target-file-size-bytes' = '268435456'
);

-- Hudi: tune parallelism
SET hoodie.upsert.shuffle.parallelism = 200;
🔥Monitoring
📊 Production Insight
A common mistake is using default settings, which can lead to thousands of small files. Always configure target file sizes and compaction.
🎯 Key Takeaway
Proper configuration and monitoring are essential for production lakehouse deployments.
● Production incidentPOST-MORTEMseverity: high

The Silent Data Corruption: How Missing ACID in Data Lakes Caused a Multi-Million Dollar Loss

Symptom
Daily revenue reports showed sudden drops and spikes that didn't match actual sales.
Assumption
The data engineering team assumed the streaming job and analytics queries were isolated because they wrote to different partitions.
Root cause
The streaming job used overwrite mode on a partition that the analytics query was reading, causing partial reads and inconsistent results.
Fix
Migrated the table to Delta Lake with ACID transactions, ensuring snapshot isolation for concurrent reads and writes.
Key lesson
  • Always use ACID-compliant table formats for concurrent read/write workloads.
  • Avoid overwrite mode on live tables; use merge or insert-overwrite with transaction support.
  • Monitor for data quality anomalies using checksums or row counts after each job.
  • Implement time travel to rollback to a known good state if corruption occurs.
  • Educate teams on the importance of isolation levels in big data systems.
Production debug guideSymptom to Action4 entries
Symptom · 01
Query returns inconsistent results across runs
Fix
Check if concurrent writes are happening. Enable snapshot isolation (Delta Lake) or use Iceberg's serializable isolation.
Symptom · 02
Schema evolution error: column not found
Fix
Verify schema history. Use schema evolution commands (ALTER TABLE ADD COLUMN) with mergeSchema option.
Symptom · 03
Time travel query fails or returns old data
Fix
Ensure version retention period is set. Check if VACUUM has cleaned up old files. Increase retention if needed.
Symptom · 04
Upsert performance is slow
Fix
Check compaction status. Run OPTIMIZE or compaction commands. Tune file size and number of small files.
★ Quick Debug Cheat SheetCommon symptoms and immediate actions for lakehouse formats.
Concurrent write conflicts
Immediate action
Check transaction log for conflicts
Commands
DESCRIBE HISTORY <table_name>
FSCK REPAIR TABLE <table_name>
Fix now
Set isolation level to 'SnapshotIsolation'
Missing data after overwrite+
Immediate action
Rollback to previous version
Commands
RESTORE TABLE <table_name> TO VERSION AS OF <version>
DESCRIBE HISTORY <table_name>
Fix now
Disable overwrite mode; use MERGE instead
Slow upserts+
Immediate action
Run compaction
Commands
OPTIMIZE <table_name>
VACUUM <table_name> RETAIN 168 HOURS
Fix now
Increase target file size
FeatureDelta LakeIcebergHudi
ACID TransactionsYesYesYes
Time TravelYes (VERSION AS OF)Yes (FOR SYSTEM_TIME)Yes (incremental queries)
Schema EvolutionYesYesYes
Partition EvolutionNoYesNo
Upsert PerformanceGoodGoodExcellent
Engine SupportSpark, Presto, Trino, FlinkSpark, Flink, Trino, Presto, HiveSpark, Flink, Presto, Trino
Metadata ScalabilityModerateExcellentGood
Primary Key RequiredNoNoYes
⚙ Quick Reference
6 commands from this guide
FileCommand / CodePurpose
data_lake_example.sqlCREATE TABLE sales_data USING parquet LOCATION '/data/sales';What is a Data Lake?
lakehouse_example.sqlCREATE TABLE sales_delta (What is a Lakehouse?
delta_lake_operations.sqlCONVERT TO DELTA parquet.`/data/sales`;Delta Lake
iceberg_operations.sqlCREATE TABLE sales_iceberg (Apache Iceberg
hudi_operations.sqlCREATE TABLE sales_hudi (Apache Hudi
best_practices.sqlALTER TABLE sales_delta SET TBLPROPERTIES (Production Best Practices

Key takeaways

1
Lakehouse architectures combine the low cost of data lakes with the reliability of data warehouses.
2
Delta Lake, Iceberg, and Hudi are open-source table formats that provide ACID transactions, schema evolution, and time travel.
3
Choose Delta Lake for Spark-centric environments, Iceberg for multi-engine, and Hudi for near-real-time upserts.
4
Proper configuration of file sizes, compaction, and snapshot retention is critical for production performance.
5
Always test time travel and rollback procedures to ensure data recovery capabilities.

Common mistakes to avoid

3 patterns
×

Not setting target file size, leading to thousands of small files.

×

Using overwrite mode on live tables without transaction support.

×

Neglecting to expire old snapshots, causing metadata bloat.

INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01SENIOR
Explain the concept of time travel in lakehouse formats. How does it wor...
Q02SENIOR
Compare Delta Lake, Iceberg, and Hudi in terms of metadata management.
Q03SENIOR
How do you handle schema evolution in a lakehouse?
Q01 of 03SENIOR

Explain the concept of time travel in lakehouse formats. How does it work?

ANSWER
Time travel allows querying historical versions of a table. It works by storing a transaction log that records every change. Each version corresponds to a snapshot. Queries can reference a specific version or timestamp to read the data as it existed at that point.
FAQ · 3 QUESTIONS

Frequently Asked Questions

01
Can I use Delta Lake without Spark?
02
How do I migrate from a Hive-style table to Iceberg?
03
What is the difference between Copy-on-Write and Merge-on-Read in Hudi?
N
Naren Founder & Principal Engineer

20+ years shipping high-throughput database systems. Everything here is grounded in real deployments.

Follow
Verified
production tested
July 13, 2026
last updated
2,165
articles · all by Naren
🔥

That's Database Design. Mark it forged?

3 min read · try the examples if you haven't

Previous
HTAP Databases: Hybrid Transactional and Analytical Processing
20 / 21 · Database Design
Next
Database Security: Encryption, Auditing, and Access Control