SQLLab
Теория· 10 мин· 15 XP

Что такое ETL и ELT

🎯 Чему вы научитесь

После этого урока вы сможете:

  • Объяснить разницу между ETL и ELT на пальцах и на архитектурной схеме
  • Выбрать правильный подход для своего источника данных
  • Понимать, как слои данных (Raw → Core → Marts) связаны с ETL/ELT
  • Ориентироваться в современном Data Stack и месте каждого инструмента

📖 Введение

Почему мы говорим об ETL и ELT?

Представьте, что вы — инженер данных в компании, которая строит ETL-платформу. У вас есть 50+ источников: PostgreSQL-базы, REST API партнёров, S3-бакеты с логами, Kafka-топики с событиями. Каждый источник имеет свою структуру, частоту обновления и требования к безопасности.

Ваша задача — доставить данные в DWH так, чтобы:

  1. Они были чистыми (без дублей, с корректными типами)
  2. Не потерялась историчность (как менялись данные во времени)
  3. Процесс был надёжным (если упал — перезапустился и не наломал дров)
  4. Запросы аналитиков летали, а не ползали

Первый вопрос, который вы должны решить для каждого источника: "Когда трансформировать данные — до загрузки или после?" Это и есть выбор между ETL и ELT.


ETL: Классический подход

код
[Источник] → (Extract) → [Staging] → (Transform) → [Core DWH] → (Load) → [Marts]

Процесс:

  1. Extract — Выгружаем сырые данные из источника в промежуточное хранилище (Staging)
  2. Transform — Чистим, обогащаем, нормализуем, применяем бизнес-правила вне DWH (например, на Spark-кластере или Python-скриптами)
  3. Load — Загружаем готовые, трансформированные данные в DWH

Когда выбирать ETL:

СитуацияПочему ETL
🔒 Чувствительные данныеМаскировка, шифрование или обезличивание до попадания в DWH (GDPR/HIPAA)
⚡ Слабый DWHЕсли ваш DWH не справляется с тяжёлыми трансформациями (например, MySQL как DWH)
🧩 Сложные трансформацииИспользуете Python-библиотеки (NLP, ML-модели), которые сложно реализовать в SQL
📦 Неструктурированные данныеОбработка JSON/XML/PDF до загрузки в реляционную модель

Минусы ETL:

  • ❌ Узкое место — трансформация (если обработка не успевает, падает весь пайплайн)
  • ❌ Сложнее поддерживать историчность (нужно отдельно хранить raw-данные)
  • ❌ Высокий порог входа (нужно знать Python/Spark)

ELT: Современный подход

код
[Источник] → (Extract) → [Raw DWH] → (Load) → (Transform внутри DWH) → [Core/Marts]

Процесс:

  1. Extract — Выгружаем сырые данные
  2. Load — Сразу загружаем их в DWH в специальный слой Raw (без изменений!)
  3. Transform — Трансформируем внутри DWH с помощью SQL/dbt (постепенно превращая Raw → Core → Marts)

Когда выбирать ELT:

СитуацияПочему ELT
🚀 Мощный DWHSnowflake/BigQuery/ClickHouse считают терабайты за секунды
💰 Большие объёмыНет смысла тащить 1 ТБ через Python-скрипт, если DWH сделает это быстрее
🔄 Частые изменения требованийАналитики сами пересобирают витрины через dbt, не беспокоя инженеров
📊 Исследовательский анализСырые данные уже в DWH, можно исследовать их без ожидания трансформации

Минусы ELT:

  • ❌ Сырые данные хранятся в DWH (занимают место, могут содержать PII)
  • ❌ Сложнее контролировать качество на входе (грязные данные уже внутри)
  • ❌ Запросы к сырому слою могут быть неоптимальными

Таблица сравнения ETL vs ELT

КритерийETLELT
Где трансформацияВне DWHВнутри DWH
Когда трансформацияДо загрузкиПосле загрузки
Сырые данные в DWH❌ Нет✅ Да (Raw-слой)
Скорость загрузкиМедленнее (из-за трансформации)Быстрее (загружаем как есть)
ГибкостьНизкая (нужно переделывать пайплайн)Высокая (меняем SQL-запросы)
ИнструментыPython, Spark, PandasSQL, dbt, агрегации в DWH
Подходит дляМаскировка PII, ML-пайплайныБольшие данные, Agile-аналитика

Слои данных: Практическая архитектура

Независимо от выбора ETL или ELT, в современном DWH принято выделять слои:

код
┌─────────────────────────────────────────────────────────────┐
│                    Sources (OLTP, API, Logs, Kafka)        │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Bronze (Raw Data)                        │
│  Храним данные в виде: JSON-логи, CDC-события          │
│  Историчность: полная, никогда не меняем                   │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Silver (Cleaned & Enriched)              │
│  Дедупликация, SCD Type 2, нормализация, DQ-проверки      │
│  Историчность: SCD2, только валидные данные                │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Gold (Aggregated / Marts)                │
│  Витрины для аналитики: отчёты, дашборды, KPI             │
│  Историчность: агрегированная (месяц/квартал)             │
└─────────────────────────────────────────────────────────────┘

В ETL: Мы делаем Transform из Bronze в Silver ещё до загрузки, затем загружаем готовый Silver.
В ELT: Сначала загружаем Bronze, потом внутри DWH строим Silver и Gold (через dbt или представления).


Инструменты в Data Stack

Зная ETL и ELT, вы уже можете классифицировать инструменты:

КатегорияETL-инструментыELT-инструментыЧто делают
ExtractAirbyte, Fivetran, StitchAirbyte, Fivetran, StitchЗабирают данные из источников
TransformPython, Spark, Pandasdbt, SQL, Spark SQLТрансформируют данные
OrchestrationAirflow, Prefect, DagsterAirflow, Prefect, DagsterЗапускают пайплайны по расписанию
StorageS3/Staging как буферDWH (Snowflake/BQ/CH)Хранят данные
StreamingKafka + Flink/SparkKafka + Flink/SparkОбрабатывают потоковые данные

Важно: Современные пайплайны часто используют гибридный подход:

  • Для чувствительных данных — ETL (маскировка до загрузки)
  • Для основных потоков — ELT (загружаем сырые, трансформируем внутри)

🔥 Инженерный лайфхак: Выбор подхода для вашего источника

Задайте себе 3 вопроса для каждого источника:

ВопросЕсли ДАЕсли НЕТ
1. Есть ли в данных PII (персональные данные)?Используйте ETL для маскировки до загрузкиМожно использовать ELT
2. Объём данных > 100 ГБ за загрузку?Используйте ELT (DWH справится быстрее)Используйте ETL (дешевле)
3. Трансформации сложные (ML/NLP)?Используйте ETL (Python-библиотеки)Используйте ELT (SQL достаточно)

Резюме: Главные мысли

  1. ETL — трансформируем до загрузки. Хорошо для защиты данных и сложной логики. Узкое место — мощность трансформации.
  2. ELT — трансформируем после загрузки. Хорошо для больших данных и гибкости. Узкое место — мощность DWH.
  3. Слои Bronze → Silver → Gold — универсальная архитектура, работает и для ETL, и для ELT.
  4. Современный подход — гибрид: PII-данные через ETL, основные потоки через ELT.

📝 Практическое задание (Домашняя работа)

Это задание вы выполните в следующем уроке, но уже сейчас подумайте:

Задача: У вас есть 4 источника данных. Для каждого определите, какой подход (ETL или ELT) вы выберете и почему.

ИсточникОбъём/деньОсобенности
Таблица клиентов (PostgreSQL)10 000 записейЕсть паспортные данные, обновляется редко
Логи мобильного приложения (S3)5 ГБ (JSON)Миллионы событий, нужны агрегаты
API курсов валют100 записейОбновляется каждый час
История заказов (Kafka)500 ГБПотоковые данные, нужна аналитика за 3 года

✅ Контрольные вопросы (для самопроверки)

  1. В чём ключевая разница между ETL и ELT?
  2. Когда вы выберете ETL вместо ELT?
  3. Что такое Bronze/Silver/Gold слои? Зачем они нужны?
  4. Какой подход использует dbt? Почему?
  5. Почему в современных платформах часто используют гибрид ETL+ELT?

🔗 В следующем уроке

Мы перейдём к Обзору источников данных и на практике увидим, как эти архитектурные решения применяются к реальным источникам: RDBMS, API, File Storage и Kafka. Вы научитесь классифицировать источники и выбирать стратегию загрузки для каждого.

Прочитайте урок до конца — прогресс засчитается автоматически