top of page

What Is a Data Lakehouse? Architecture & Implementation

doramadhusudan
3 days ago
11 min read

A data lakehouse is a unified data architecture that combines the low-cost storage flexibility of a data lake with the structured querying and data management of a data warehouse. Instead of maintaining separate systems a data lake for raw data (JSON, Parquet, CSV) and a data warehouse for structured analytics (SQL tables) a lakehouse stores all data in one open format (Delta Lake, Apache Iceberg), making it queryable by SQL, reporting tools, and machine learning frameworks without moving data between systems.


Without a lakehouse, enterprises run two architectures in parallel: data lake for data science (Python, Spark) and data warehouse for BI (Power BI, Tableau) doubling infrastructure costs, duplicating ETL logic, and creating data consistency problems (same metric calculated differently in each system). With a lakehouse, one storage layer serves both analytics and ML workloads on the same data.


This guide covers what a data lakehouse is (vs traditional architectures), data lakehouse architecture patterns (storage, compute, governance layers), lakehouse vs data warehouse vs data lake comparison, Microsoft Fabric lakehouse implementation, when to adopt a lakehouse, and best practices for enterprise deployment.


What Is a Data Lakehouse?


A data lakehouse is a data management architecture that stores all data types (structured tables, semi-structured JSON/XML, unstructured files) in open-format object storage (S3, Azure Data Lake, OneLake), while providing ACID transactions, schema enforcement, and SQL query performance comparable to a traditional data warehouse.


Key characteristics:


  1. Open storage format (Delta Lake, Apache Iceberg, Apache Hudi) on cloud object storage (S3, Azure Data Lake Gen2, OneLake)

  2. ACID transactions for reliable writes (prevent partial updates, support concurrent users)

  3. Schema enforcement with schema evolution (add columns without breaking existing queries)

  4. Direct SQL + BI tool access (Power BI, Tableau query the lakehouse directly via SQL endpoints)

  5. ML/data science access (Python, Spark, TensorFlow read the same data without copying)

  6. Time travel / versioning (query data as of a specific timestamp or version)


How it differs from traditional architectures:


Traditional two-tier architecture:


  • Data Lake (Tier 1): Store raw data (JSON, Parquet, CSV) → Data scientists access via Python/Spark

  • Data Warehouse (Tier 2): Copy cleaned data to warehouse (SQL tables) → BI analysts access via SQL/Power BI

  • Problem: Data duplicated across systems, ETL logic run twice (once for lake, once for warehouse), metric inconsistency


Lakehouse architecture (unified single tier):


  • Lakehouse (Single Tier): Store all data in open format (Delta Lake Parquet) → Both data scientists (Python/Spark) AND BI analysts (SQL/Power BI) access the same data

  • Benefit: One copy of data, one ETL pipeline, metrics always consistent


Example use case: E-commerce company stores raw clickstream data (JSON logs), customer transactions (structured CSV), and product images (unstructured files) in a lakehouse. Data engineers clean and transform into Delta Lake tables. Both data scientists query raw logs for ML models (churn prediction) and BI analysts query cleaned tables in Power BI for revenue dashboards same data, no copying.


Data Lakehouse Architecture: Core Components


A data lakehouse has three layers: storage, compute, and governance.


1. Storage Layer (Open Table Formats)


Purpose: Store data in open formats that support both analytics and ML workloads.


Technologies:


Delta Lake (most popular):


  • Parquet files with transaction log (JSON) for ACID guarantees

  • Supports schema enforcement, time travel, upserts (UPDATE/DELETE)

  • Native integration: Azure Databricks, Microsoft Fabric, AWS EMR



Apache Iceberg:

  • Open-source table format with hidden partitioning (automatic partition optimization)

  • AWS, Google Cloud, Snowflake support


Apache Hudi:


  • Real-time data ingestion (streaming upserts)

  • Popular on AWS EMR


Storage substrate:


  • Azure: Azure Data Lake Storage Gen2 (ADLS Gen2) or Microsoft Fabric OneLake

  • AWS: Amazon S3

  • Google Cloud: Google Cloud Storage


Key feature: Data stored as Parquet files (columnar format for fast analytics) with metadata layer (transaction logs, schema, partitioning) managed by Delta/Iceberg/Hudi.


2. Compute Layer (SQL + Spark Engines)

Purpose: Query and transform data in the lakehouse using SQL (BI analysts) or Spark (data engineers/scientists).


SQL Engines (BI/analytics):


  • Azure Synapse SQL Serverless: Query Delta Lake via T-SQL

  • Microsoft Fabric SQL endpoint: Query OneLake lakehouse tables in Power BI

  • Databricks SQL Warehouse: Run SQL queries on Delta Lake

  • Snowflake (on Iceberg): Query Iceberg tables via SQL


Spark Engines (data engineering/ML):


  • Azure Databricks Spark: Transform Delta Lake data with PySpark

  • Microsoft Fabric Spark: Process OneLake data with notebooks

  • AWS EMR Spark: Run Spark jobs on S3 Delta Lake


Key feature: Separation of storage and compute scale SQL compute for heavy BI workloads (50 concurrent Power BI users), scale Spark compute for large ETL jobs (10TB daily ingestion), without resizing storage.


3. Governance Layer (Metadata, Security, Lineage)


Purpose: Manage metadata (table schemas, lineage), enforce security (row-level access), and ensure data quality.


Components:


Metadata catalog:


  • Unity Catalog (Databricks): Central metadata store for Delta Lake

  • Microsoft Fabric OneLake Catalog: Metadata for Fabric lakehouse

  • AWS Glue Data Catalog: Metadata for S3-based lakehouses


Security:


  • Row-level security / column-level access: Grant specific users access to filtered rows (sales reps see only their region)

  • Data masking: Hide sensitive columns (SSN) from non-admin users


Data quality:


  • Delta Lake constraints: Enforce NOT NULL, CHECK constraints (Revenue > 0)

  • Great Expectations / Datafold: Automated data quality tests


Data lineage:


  • Track where data came from (source system → lakehouse table → Power BI report)

  • Microsoft Purview, Databricks Lineage, Apache Atlas


For data governance consulting projects, Aptocoiner implements lakehouse governance with Unity Catalog + Microsoft Purview centralized metadata, row-level security across 100+ Fabric lakehouse tables, and automated lineage tracking (source → transformation → BI report).


Data Lakehouse vs Data Warehouse vs Data Lake


Enterprises often confuse lakehouse, warehouse, and lake here's the breakdown:


Feature

Data Warehouse

Data Lake

Data Lakehouse

Data types

Structured only (tables)

All types (structured, semi-structured, unstructured)

All types (structured, semi-structured, unstructured)

Storage format

Proprietary (Snowflake, Synapse)

Open formats (Parquet, JSON, CSV)

Open formats (Delta Lake, Iceberg)

ACID transactions

✅ Yes

❌ No

✅ Yes

Schema

Schema-on-write (enforce at load)

Schema-on-read (no enforcement)

Schema enforcement + evolution

Query performance

Fast (indexed, optimized)

Slow (scan raw files)

Fast (columnar Parquet + metadata)

BI tool access

✅ Direct SQL

❌ Requires ETL to warehouse first

✅ Direct SQL

ML/data science access

❌ Limited (export data)

✅ Direct (Python, Spark)

✅ Direct (Python, Spark)

Cost

High (compute + storage bundled)

Low (object storage)

Low (object storage)

Use case

Historical BI reporting (structured analytics)

Data science, ML (raw data exploration)

Unified analytics + ML (BI + DS on same data)

When to use each:


Data Warehouse (Snowflake, Azure Synapse, Redshift):


  • ✅ Only structured data (no JSON, no logs, no ML use cases)

  • ✅ Legacy BI workloads (existing Tableau/Power BI reports on SQL)

  • ✅ Fully managed service (no infrastructure management)


Data Lake (raw S3/ADLS bucket):


  • ✅ Data science first (ML models, Python notebooks, no BI reporting)

  • ✅ Storage for raw data (archive logs, staging area for warehouse ETL)

  • ❌ Not for concurrent users (no ACID, no schema enforcement)


Data Lakehouse (Delta Lake, Iceberg):


  • ✅ Unified analytics + ML (same data for Power BI dashboards AND Python ML models)

  • ✅ Cost-sensitive workloads (object storage 10× cheaper than warehouse)

  • ✅ Large-scale data (100TB+ datasets, hourly ingestion)

  • ✅ Open formats (avoid vendor lock-in, support multiple query engines)


Migration path: Many enterprises migrate Data Lake + Data Warehouse → Data Lakehouse to eliminate dual systems (save 40–60% on infrastructure costs, unify metrics across BI and ML).


For data warehouse consulting projects, Aptocoiner designs lakehouse-first architectures when clients have both BI and ML requirements Azure Synapse SQL Serverless queries Delta Lake for Power BI reporting, Databricks Spark processes the same Delta tables for ML models.


Microsoft Fabric Lakehouse: Implementation Guide


Microsoft Fabric lakehouse is the managed lakehouse offering in Microsoft Fabric built on OneLake (Fabric's unified data lake storage) with Delta Lake format, T-SQL endpoint for Power BI, and Spark notebooks for data engineering.


Step 1: Create a Lakehouse in Fabric


How:


  1. Navigate to Microsoft Fabric (app.fabric.microsoft.com)

  2. Create workspace (e.g., "Analytics Workspace")

  3. New → Lakehouse (select "Lakehouse" from Data Engineering workload)

  4. Name lakehouse (e.g., "Sales Lakehouse")


Result: Empty lakehouse with two access modes:


  • Lakehouse view: Browse folders/files (OneLake explorer)

  • SQL endpoint: Query tables via T-SQL (Power BI connects here)


Step 2: Load Data into Lakehouse


Option 1: Upload files


  • Lakehouse → Get data → Upload files

  • Drag CSV/Parquet/JSON files into lakehouse

  • Files stored in OneLake as Parquet (Delta format)


Option 2: Use Data Pipelines (ETL)


  • New → Data pipeline

  • Copy data activity: SQL Server → Lakehouse (full load)

  • Schedule: Daily at 2 AM


Option 3: Spark notebooks (transformation logic)

# Read CSV from OneLake
df = spark.read.csv("Files/raw_data/sales.csv", header=True, inferSchema=True)

# Transform data
df_clean = df.filter(df["Revenue"] > 0) \
             .withColumn("FullName", concat(col("FirstName"), lit(" "), col("LastName")))

# Write to Delta Lake table
df_clean.write.format("delta").mode("overwrite").saveAsTable("sales_clean")

Result: Data loaded as Delta Lake tables in lakehouse, queryable via SQL endpoint.


Step 3: Query Lakehouse in Power BI


How:

  1. Power BI Desktop → Get data → Power BI datasets and dataflows

  2. Select lakehouse SQL endpoint (e.g., "Sales Lakehouse")

  3. Select tables (e.g., sales_clean)

  4. Load → Data imported into Power BI


Alternative (DirectQuery):


  • Get data → SQL Server

  • Server: Fabric SQL endpoint URL (<workspace>.fabric.microsoft.com)

  • Database: Lakehouse name

  • DirectQuery mode → Power BI queries lakehouse live (no import)


Result: Power BI reports query lakehouse directly no separate data warehouse, no duplicate ETL.


For Power BI implementation projects, Aptocoiner connects Power BI to Fabric lakehouse SQL endpoints DirectQuery for large datasets (10GB+), Import mode for small dimensions (customer, product tables).


Step 4: Enable Data Governance (Unity Catalog Integration)


Purpose: Enforce row-level security, track lineage, manage metadata centrally.


How:


  1. Fabric Lakehouse → Settings → Security

  2. Enable row-level security (filter rows by user group)

  3. Connect Microsoft Purview (optional for cross-workspace lineage tracking)


Example RLS rule:

-- Sales reps see only their region orders
[Region] = USERPRINCIPALNAME() -> Get user's region attribute from Azure AD

Lakehouse Best Practices


1. Partition Large Tables by Date


Problem: 100M-row sales table queries scan all rows (10-minute query time in Power BI).


Solution: Partition by OrderDate (year, month folders) queries filter to specific partition (scan 1M rows instead of 100M, 10-second query time).


How (Delta Lake):

df.write.format("delta") \
  .partitionBy("OrderYear", "OrderMonth") \
  .mode("overwrite") \
  .saveAsTable("sales")

Result: Power BI query WHERE OrderDate >= '2024-01-01' scans only 2024 partitions, skips 2020–2023 data.


2. Use Z-Ordering for Multi-Column Filters


Problem: Queries filter by Region AND ProductCategory (both low-cardinality)—partition by date only doesn't help.


Solution: Z-Ordering (Delta Lake optimization) co-locates rows with same Region + ProductCategory in same Parquet files.


How:

from delta.tables import DeltaTable

DeltaTable.forName(spark, "sales").optimize().executeZOrderBy("Region", "ProductCategory")

Result: Query WHERE Region = 'North' AND ProductCategory = 'Laptops' reads fewer files (faster scan).


3. Enable Change Data Feed for Incremental Loads


Problem: Daily ETL refreshes entire 100M-row table (2-hour runtime, high compute cost).


Solution: Change data feed (Delta Lake) tracks only changed rows—ETL loads inserts + updates only.


How:

# Enable change data feed on table
spark.sql("ALTER TABLE sales SET TBLPROPERTIES (delta.enableChangeDataFeed = true)")

# Read only changes since last load
df_changes = spark.read.format("delta") \
  .option("readChangeFeed", "true") \
  .option("startingVersion", 10) \
  .table("sales")

Result: Incremental load processes 10k changed rows instead of 100M total rows (5-minute runtime vs 2 hours).


4. Implement Table Constraints for Data Quality


Problem: Bad data lands in lakehouse (negative revenue, NULL customer IDs)—breaks Power BI reports.


Solution: Delta Lake constraints reject bad data at write time.



How:

spark.sql("""
  ALTER TABLE sales ADD CONSTRAINT revenue_positive CHECK (Revenue > 0)
""")

spark.sql("""
  ALTER TABLE sales ALTER COLUMN CustomerID SET NOT NULL
""")

Result: ETL job fails if attempted insert violates constraints (negative revenue rejected, ensures data quality).


5. Use Liquid Clustering (Fabric/Databricks) for Automatic Optimization

Problem: Manual Z-Ordering requires periodic OPTIMIZE commands (forget to run → performance degrades).

Solution: Liquid clustering (Databricks/Fabric) automatically re-clusters data on write.

How:

CREATE TABLE sales (
  OrderID INT,
  Region STRING,
  ProductCategory STRING,
  Revenue DECIMAL(10,2)
)
USING DELTA
CLUSTER BY (Region, ProductCategory);

Result: Every write auto-clusters by Region + ProductCategory no manual optimization needed.


For data engineering consulting projects, Aptocoiner implements lakehouse optimization patterns partitioning by date (monthly granularity), Z-Ordering on high-filter columns (Region, Status), and liquid clustering for auto-maintenance (no manual OPTIMIZE jobs).


When to Adopt a Data Lakehouse


Adopt a lakehouse if:


✅ Unified analytics + ML: Same data for BI dashboards AND ML models (no dual-system overhead)

✅ Large-scale data (10TB+): Object storage cheaper than warehouse proprietary storage (10× cost savings)

✅ Cost-sensitive workloads: Separate compute from storage (scale compute independently)

✅ Streaming + batch: Real-time ingestion (Kafka → Delta Lake) + batch reports (daily Power BI refresh)

✅ Open formats preferred: Avoid vendor lock-in (Delta Lake works on Azure, AWS, GCP)


Stay with data warehouse if:


✅ Only BI workloads: No data science, no ML, no Python/Spark use cases

✅ Small data (<1TB): Warehouse cost-effective at small scale

✅ Fully managed priority: Don't want to manage lakehouse infrastructure (Databricks/Fabric setup)


Migration trigger: If you're maintaining both a data lake (for data science) AND a data warehouse (for BI), consolidate to lakehouse (eliminate duplicate ETL, unify metrics, cut infrastructure costs 40–60%).


Frequently Asked Questions


Q: What's the difference between a data lakehouse and a data warehouse?


A: A data warehouse stores only structured data (SQL tables) in proprietary format (Snowflake, Synapse), optimized for BI queries, with compute and storage bundled (expensive at scale). A data lakehouse stores all data types (structured, semi-structured, unstructured) in open formats (Delta Lake Parquet) on low-cost object storage (S3, Azure Data Lake, OneLake), supporting both BI tools (Power BI queries via SQL endpoint) and data science frameworks (Python, Spark) on the same data. Key difference: Lakehouse = unified architecture for analytics + ML on open storage; Warehouse = BI-only on proprietary storage. Cost example: 100TB data warehouse costs $5k–$20k/month (Snowflake storage + compute), same 100TB lakehouse costs $2k/month (ADLS Gen2 storage) + pay-per-query compute. For data warehouse modernization projects, Aptocoiner migrates clients from traditional warehouses to lakehouses when ML requirements emerge (add Python-based churn models without duplicating data).


Q: What is Microsoft Fabric lakehouse and how does it compare to Azure Databricks?


A: Microsoft Fabric lakehouse is a fully managed lakehouse in Microsoft Fabric stores data in OneLake (Fabric's unified data lake) as Delta Lake tables, queryable via SQL endpoint (Power BI connects directly) and Spark notebooks (data engineering transformations). Azure Databricks is a separate lakehouse platform stores data in ADLS Gen2 (your Azure storage) as Delta Lake, queryable via Databricks SQL Warehouse and Spark clusters. Key differences: (1) Storage: Fabric OneLake (platform-managed, included in Fabric capacity billing) vs Databricks ADLS Gen2 (you manage, pay separately). (2) Integration: Fabric tightly integrates Power BI, Data Factory, and lakehouse (single workspace) vs Databricks requires connectors. (3) Licensing: Fabric per-capacity (F2-F2048 SKUs covering all workloads) vs Databricks per-DBU + separate ADLS storage. Use Fabric lakehouse when Power BI is primary BI tool (native SQL endpoint integration, no separate connector) and you want unified platform (BI + ETL + lakehouse in one Fabric capacity). Use Databricks when multi-cloud (AWS, GCP) or advanced ML engineering (MLflow, Delta Live Tables, Photon engine). Aptocoiner architects Fabric lakehouse for Power BI-first clients (95% of BI in Power BI) and Databricks for ML-heavy workloads (50+ data scientists, complex ML pipelines).


Q: How do I migrate from a data warehouse to a data lakehouse?


A: Five-step migration path: (1) Assess current state inventory warehouse tables (fact/dimension split), identify dependencies (ETL jobs, Power BI datasets, downstream reports).

(2) Design lakehouse schema map warehouse tables to Delta Lake (keep star schema if possible lakehouse supports dimensional modeling), partition large fact tables by date (OrderYear, OrderMonth).

(3) Implement dual-write during migration ETL writes to both warehouse (existing) AND lakehouse (new) for 2–4 weeks (validate lakehouse data accuracy, test Power BI reports on lakehouse SQL endpoint).

(4) Migrate Power BI datasets reconnect reports from warehouse to lakehouse SQL endpoint (test query performance add Z-Ordering if slower than warehouse), enable incremental refresh on lakehouse-connected datasets (only load changed rows).

(5) Decommission warehouse once all reports validated on lakehouse (same metrics, acceptable performance), turn off warehouse compute (keep storage archive for 90 days as rollback). Common pitfall: Migrating entire warehouse at once (big-bang)—instead, migrate one subject area at a time (Sales lakehouse → migrate sales reports → validate → next subject area). For data warehouse migration projects, Aptocoiner runs phased migrations—pilot with 1–2 Power BI workspaces on lakehouse (2 weeks), validate metrics match warehouse, then migrate remaining workspaces over 8–12 weeks.


Build Modern Analytics with Data Lakehouse Architecture


Whether you're migrating from traditional data warehouse + data lake architectures to a unified lakehouse (eliminate dual systems, cut infrastructure costs 40–60%), implementing Microsoft Fabric lakehouse for Power BI + Spark workloads (SQL endpoint for BI, notebooks for engineering), or designing lakehouse governance with row-level security and metadata lineage, Aptocoiner Analytics brings certified data architecture expertise.


Our Microsoft-certified engineers deliver proven lakehouse implementations for US and UK enterprises, with measurable outcomes: 40–60% infrastructure cost savings through warehouse-to-lakehouse migration (object storage vs proprietary), unified analytics + ML platforms (one data copy serves both Power BI reports and Python models), and enterprise-grade governance with Unity Catalog + Microsoft Purview (centralized metadata, automated lineage, row-level security across 100+ tables).


From lakehouse architecture design to Fabric lakehouse implementation to Power BI lakehouse integration, we architect unified data platforms for modern analytics.


What Is a Data Lakehouse? Architecture & Implementation
What Is a Data Lakehouse? Architecture & Implementation

Schedule a free discovery call to discuss your data lakehouse and analytics modernization needs.


References & Further Reading


 
 
 

Comments


bottom of page