Data Engineering/Fundamentals

Beginner7 min read

ETL vs ELT: Where Transformation Happens

The classic Extract-Transform-Load pattern and its modern successor, Extract-Load-Transform — what changed, why it changed, and when you'd still choose each one.

Every data pipeline does three things in some order: it extracts data from a source, transforms it into a usable shape, and loads it into a destination. The order of the last two letters — ETL vs. ELT — is one of the most-discussed distinctions in data engineering, because it reflects a real shift in where compute and cost live.

ETL: transform before loading

In the classic ETL pattern, data is extracted from source systems, transformed on a separate processing server (cleaning, joining, aggregating), and only the final, modeled result is loaded into the destination warehouse. This was the dominant pattern when warehouse storage and compute were expensive and tightly coupled — you transformed data before loading it so you never had to pay to store or query raw, messy data.

ELT: load first, transform inside the warehouse

Modern cloud warehouses (Snowflake, BigQuery, Redshift, Databricks) decouple storage from compute and make both cheap and elastic. That flips the economics: it's now cheaper to load raw data as-is and transform it using the warehouse's own compute, usually with SQL, than to maintain a separate transformation server. Tools like dbt exist specifically to manage this in-warehouse transformation layer.

  • ETL: transform happens outside the destination, before loading
  • ELT: transform happens inside the destination, after loading
  • ELT keeps a raw copy of source data, which is valuable for debugging and reprocessing
  • ELT shifts transformation cost and skill requirements toward SQL
-- A typical ELT transform: raw data already landed in the warehouse,
-- transformation happens as a SQL model (e.g. a dbt model)
select
  order_id,
  customer_id,
  cast(order_ts as timestamp) as ordered_at,
  amount_cents / 100.0 as amount_usd
from raw.orders
where amount_cents is not null;

Tip — When you'd still reach for ETL

If a source system can't tolerate large raw exports (strict PII rules, extremely high volume), or your destination has limited compute, transforming before load still makes sense. Streaming pipelines that enrich events in-flight are also effectively ETL.

In practice, most modern stacks are ELT with a well-defined transformation layer on top — raw data lands untouched, then layered SQL models progressively clean, join, and aggregate it into what analysts and dashboards consume.