ETLELTdbtClickHouseдата-инженерия

ETL и ELT: в чём разница простыми словами

2026-07-10 11 мин

Коротко: ETL и ELT — два порядка одних и тех же трёх шагов: извлечь данные (Extract), преобразовать (Transform), загрузить (Load). В ETL трансформация идёт до загрузки в хранилище, в ELT — уже внутри хранилища, силами самого DWH. Разница в одной переставленной букве, но она меняет всё: где живёт логика преобразований, кто её пишет и как быстро аналитик может её править. Современные колоночные хранилища (ClickHouse, Snowflake, BigQuery) достаточно мощные, чтобы гонять трансформации внутри себя, поэтому индустрия сместилась в сторону ELT.

Что такое ETL и что означает каждая буква?

ETL — это Extract, Transform, Load. Классический конвейер, который родился в эпоху дорогих хранилищ, когда за каждый гигабайт в аналитической БД платили ощутимые деньги, а вычислительные мощности были ограничены.

Разберём по буквам на примере интернет-магазина:

Ключевая идея ETL: в хранилище попадают только чистые, отобранные данные. Всё «грязное» преобразование происходит по дороге, на отдельном движке. Если хочешь пощупать сам этап трансформации на SQL, это ровно те запросы, что мы гоняем в SQL-тренажёре — JOIN, агрегаты, оконные функции.

Чем ELT отличается от ETL?

ELT — это Extract, Load, Transform. Те же три слова, но Transform и Load поменялись местами. И это не косметика.

В ELT мы сначала заливаем сырые данные в хранилище как есть, а уже потом преобразуем их внутри самого DWH обычными SQL-запросами. Промежуточный сервер для трансформаций не нужен — всю тяжёлую работу тянет хранилище.

Сравним подходы в лоб:

КритерийETLELT
Где идёт TransformНа отдельном движке до загрузкиВнутри хранилища после загрузки
Что лежит в DWHТолько чистые витриныСырые данные + витрины поверх них
Кто пишет логикуЧасто дата-инженер на Python/JavaАналитик или AE на SQL
Скорость правокМедленно (переливать пайплайн)Быстро (поправил SQL — пересчитал)
Стоимость храненияНиже (лежит только нужное)Выше (лежит и сырьё тоже)
Стоимость вычисленийНа стороне ETL-сервераНа стороне DWH

Простая аналогия. ETL — это когда ты приносишь домой уже нарезанный и вымытый салат из кулинарии: холодильник занят по минимуму, но если захотел другую нарезку — иди обратно в магазин. ELT — ты приносишь домой все сырые овощи и режешь как надо прямо на кухне: места в холодильнике уходит больше, зато любой рецепт собираешь на месте за минуту.

Почему современные DWH всё чаще выбирают ELT?

Несколько причин сошлись одновременно, и маятник качнулся в сторону ELT:

Итог: цикл «придумал метрику → написал SQL → увидел результат» в ELT занимает минуты, а не дни согласований с дата-инженерами. Для продуктовой аналитики, где гипотезы меняются каждую неделю, это решающий фактор. Подробнее про то, как dbt устроен на практике, — в разборе dbt для аналитика: первые шаги.

Как выглядит реальный пайплайн Postgres → ClickHouse → dbt?

Соберём типичный ELT-контур российской продуктовой команды. Источник — боевая база на PostgreSQL, хранилище — ClickHouse, трансформации — на dbt.

Шаг Extract + Load. Забираем таблицу заказов из Postgres и как есть льём в raw-слой ClickHouse. Часто это делает Airflow-таск или специализированный коннектор. Смысл — притащить сырьё без изменений:

-- Raw-слой в ClickHouse: копия таблицы из Postgres, без преобразований
CREATE TABLE raw.orders
(
    order_id      UInt64,
    user_id       UInt64,
    status        String,
    amount        Decimal(12, 2),
    currency      String,
    created_at    DateTime
)
ENGINE = MergeTree
ORDER BY (created_at, order_id);

Инкрементальную выгрузку из Postgres обычно делают по колонке created_at или по возрастающему id — тянут только новые строки с прошлого запуска. Как аккуратно догружать историю, если что-то пропустили, разобрано в статье про бэкфилл данных.

Шаг Transform. Теперь чистим и агрегируем — уже внутри ClickHouse, средствами dbt. Модель на SQL считает дневную витрину выручки, приводя валюты к рублям и отбрасывая отменённые заказы:

-- models/marts/daily_revenue.sql
{{ config(materialized='table') }}

WITH clean AS (
    SELECT
        toDate(created_at)                        AS dt,
        user_id,
        multiIf(
            currency = 'USD', amount * 92,
            currency = 'EUR', amount * 100,
            amount
        )                                          AS amount_rub
    FROM {{ source('raw', 'orders') }}
    WHERE status = 'paid'
)
SELECT
    dt,
    count(DISTINCT user_id)      AS paying_users,
    round(sum(amount_rub), 2)    AS revenue_rub,
    round(avg(amount_rub), 2)    AS avg_check_rub
FROM clean
GROUP BY dt
ORDER BY dt;
{{ source('raw', 'orders') }} — это ссылка dbt на сырую таблицу. dbt сам разворачивает её в raw.orders и строит граф зависимостей: сначала raw, потом витрина. Если завтра понадобится когортный разрез или разбивка по каналам, ты просто пишешь новую модель поверх того же сырья — источник трогать не нужно.

Витрина daily_revenue дальше идёт в дашборд. На её основе легко посчитать продуктовые метрики — например, ARPU как revenue_rub / paying_users или следить за DAU платящих пользователей. Проверить логику агрегатов и оконных функций перед тем, как оформлять в dbt-модель, удобно прямо в SQL-песочнице.

Иногда часть трансформации всё же выгодно сделать на Python — например, распарсить кривые JSON-логи или обучить простую модель скоринга перед загрузкой. Тогда получается гибрид: тяжёлую подготовку данных пишут на Python и обкатывают в Python-тренажёре, а бизнес-логику витрин оставляют на SQL в dbt.

Где аналитик встречает ETL, а где ELT?

На практике аналитик почти всегда работает с буквой T — с трансформациями. А вот где именно она стоит, зависит от зрелости команды:

Важно понимать: ELT не «отменил» ETL. Валидацию, дедупликацию, разбор вложенных структур всё равно кто-то делает — просто в ELT это делается SQL-запросами внутри хранилища, а не отдельным движком снаружи. Классические SQL-приёмы вроде дедупликации через ROW_NUMBER и оконных функций — это и есть тот самый Transform, только на языке аналитика.

Какие инструменты используют для ETL и ELT в РФ?

Стек в российских командах в 2026-м довольно устоявшийся. Разложу по этапам конвейера:

Хранилище (куда грузим).

Оркестрация (кто запускает по расписанию).

Трансформация (буква T).

Извлечение и загрузка (E и L).

Комбинаций много, но каркас почти всегда один: источник → сырой слой в ClickHouse → dbt-модели → дашборды. Знать названия инструментов полезно, но на собесе спросят не про кнопки, а про то, понимаешь ли ты логику.

Что выбрать под задачу: ETL или ELT?

Универсального ответа нет — выбор диктуют объёмы, стек и требования к данным. Несколько ориентиров:

На практике команды редко выбирают идеологически чистый вариант. Чаще решают по каждому источнику отдельно: где-то дешевле дотрансформировать до загрузки, где-то — сложить сырьё и разобрать SQL уже внутри. Умение аргументировать этот выбор на конкретных цифрах — ровно то, что отличает сильного кандидата на собеседовании аналитика.

Что важно знать про ETL/ELT для собеседования?

Вопрос «в чём разница между ETL и ELT» — классика на собеседовании аналитика и дата-инженера. Вот что стоит уметь ответить чётко:

Мини-глоссарий, чтобы термины не плыли:

Отработать эту тему живьём проще всего на практике. Первые пять задач в SQL-тренажёре и Python-тренажёре открыты бесплатно — этого достаточно, чтобы прочувствовать, как выглядит этап Transform на реальных данных; дальше задачи и разборы доступны в Pro. Если хочется сначала подтянуть базу SQL с нуля, загляни в курс по SQL, а прогнать вопрос про ETL/ELT в формате диалога можно в AI-интервьюере — он задаёт уточняющие вопросы ровно как настоящий интервьюер.

Разница между ETL и ELT — это не про моду и не про «какой инструмент круче». Это про то, где стоит буква T и кто ей управляет. В современном стеке ей всё чаще управляет аналитик — а значит, уверенный SQL и понимание, как данные превращаются в витрины, стоят дороже, чем знание любого конкретного инструмента. Хочешь проверить готовность к собесу целиком — собери связку из SQL с нуля и практики, и вопрос про ETL/ELT перестанет быть страшным.

Готовишься к собеседованию аналитика?
ETL/ELT почти всегда всплывает на собесе рядом с SQL и продуктовыми кейсами. Разбери реальные вопросы и потренируйся отвечать без воды.
Открыть вопросы для собеседования →