Learning Platform
Глоссарий Troubleshooting
Урок 03.01 · 18 мин
Начальный
analytics-engineeringELTETLdata-roles

Analytics engineering и роль dbt

До 2018-2019 годов в данных существовало два больших профессиональных лагеря: data engineers, которые собирали и доставляли данные в warehouse, и data analysts/BI, которые писали SQL поверх готовых таблиц для отчётов. Между этими лагерями была дыра — кто-то должен был превращать «сырые таблицы из source-систем» в «удобные таблицы для аналитики». На практике этим занимались либо data engineers (которые писали Spark/Airflow без аналитической интуиции), либо аналитики (которые делали 200-строчные SQL-запросы с CTE-вложенностью семь уровней).

Analytics engineer — это роль, выросшая из этой дыры. И dbt — инструмент, который сделал эту роль масштабируемой как профессию.


Откуда взялась роль

Раньше пайплайн данных выглядел так:

Старая схема: ETL до облачных warehouses
OLTP / SaaS APIPostgreSQL приложения, Stripe API, Salesforce API — источники данных
extract
Spark / PythonТяжёлый ETL движок: данные тянутся, трансформируются в памяти, и грузятся уже готовыми. Делают data engineers.
load (transformed)
Data warehouseФинальная таблица сразу в готовом виде для BI
BI / TableauАналитики и BI пишут SELECT поверх готовых таблиц

Трансформации жили в Python/Spark коде data engineers. Аналитики видели только финальные таблицы и общались с инженерами через тикеты вида «добавь поле gross_margin в table_orders». Цикл обратной связи — недели. Бизнес-логика — у инженеров. SQL-навыки аналитиков — недоиспользованы.

В 2014-2018 случилась революция: облачные columnar warehouses (Snowflake, BigQuery, Redshift) стали достаточно дешёвыми и быстрыми, чтобы хранить и пересчитывать всё. Стало возможно загружать данные в warehouse сырыми (без трансформации) и трансформировать их уже внутри warehouse, чистым SQL. Так родился паттерн ELT (Extract -> Load -> Transform) на смену ETL.


ELT vs ETL: разница в одном слове

ETL и ELT отличаются местом, где живёт буква T (transform).

ELT — трансформация внутри warehouse
OLTP / SaaS APIТе же источники: Postgres, Stripe, Salesforce, Google Ads, Mixpanel
extract
Fivetran / AirbyteТонкий слой загрузки: тянет данные из источника, грузит как есть в raw схему warehouse. Без трансформаций.
load (raw)
Data warehouseСнапшоты source-систем как есть, в raw схеме: raw.stripe_payments, raw.salesforce_accounts
transform (dbt)
Warehouse (modeled)Трансформированные таблицы в марте: staging, intermediate, marts. Делает analytics engineer через dbt.
BI / TableauАналитики работают с marts

Ключевая идея ELT: сырые данные грузятся «как есть», а трансформации происходят уже внутри warehouse через SQL. Это становится возможным, только когда warehouse достаточно быстрый, чтобы за минуты пересчитать 100 млн строк — что и сделали Snowflake / BigQuery / Redshift / Databricks.

Вот сравнительная таблица:

АспектETL (старая школа)ELT (новая школа, dbt-эра)
Где живёт логикаPython/Scala/SparkSQL в warehouse
Кто пишетData engineerAnalytics engineer
Цикл измененияДни-недели (через PR в кодбазу пайплайна)Часы (PR с SQL-моделью)
ТестированиеCustom test suite, часто ручноеДекларативные тесты (not_null, unique)
ДокументацияConfluence wikiГенерируется из кода (dbt docs)
LineageРасскажет старший инженерDAG автоматически из ref()
ДебагSpark UI, логи воркеровEXPLAIN, target/compiled SQL
ComputeКластер Spark, scale up = новый кластерWarehouse, scale up = виртуальный warehouse

ELT не убил ETL полностью. ETL остаётся валидным для случаев: PII-фильтрация ДО загрузки в warehouse, реал-тайм стриминг (Kafka), source-системы с очень дорогим компьютом (S3 на большом объёме). Но для 95% типичных BI-задач ELT с dbt — стандарт 2026 года.


Что такое analytics engineering

Analytics engineering — это роль на стыке data engineering и data analysis. Analytics engineer:

  • Знает SQL хорошо (window functions, CTE, оптимизация планов)
  • Понимает бизнес-метрики и общается с stakeholders
  • Применяет software engineering практики: version control, code review, тесты, документация, CI/CD
  • Не пишет low-level Spark/Python код (это data engineer)
  • Не делает дашборды и не презентует слайды (это analyst)
Где analytics engineer в команде данных
Data engineerУправляет инфраструктурой: warehouse, EL-инструменты (Fivetran), оркестрация (Airflow/Dagster), Kafka, K8s. Поднимает и поддерживает.
доставляет raw данные
Analytics engineerПревращает raw данные в clean, modeled, tested таблицы. Пишет dbt-модели, тесты, документацию. Работает в SQL.
публикует marts
Data analyst / BIИспользует marts для построения дашбордов, ad-hoc анализа, отчётов для бизнеса. Tableau, Looker, Metabase.

В малой команде один человек может играть все три роли. В средней обычно есть analytics engineer как отдельная позиция. В большой — целая команда analytics engineers, разделённая по доменам (revenue, marketing, product).

DA, DS, DE и Analytics Engineer — полный обзор ролей ELT: Extract, Load, Transform — фундамент dbt-подхода

Конкретные обязанности типичного analytics engineer:

  1. Получает требование от бизнеса: «нужна метрика monthly revenue с разбивкой по сегментам клиентов»
  2. Идёт в raw данные warehouse, находит нужные таблицы (Stripe payments, Salesforce accounts)
  3. Пишет dbt-модели: stg_stripe__payments, stg_salesforce__accounts, int_payments_with_account, mart_monthly_revenue
  4. Добавляет тесты: not_null на foreign keys, unique на primary keys, custom test «revenue не может быть отрицательной»
  5. Пишет документацию: descriptions для каждой колонки, doc-block с бизнес-определением «revenue»
  6. Открывает PR, code review от другого AE
  7. Merge -> CI запускает dbt run в production warehouse -> метрика появляется в Tableau

Это цикл от 4 часов до 2 дней. В старой ETL-схеме на это уходили недели.


Где здесь dbt

dbt — это инструмент, который делает T в ELT. Он:

  1. Превращает SQL-файлы в дерево зависимостей (DAG) через функцию ref()
  2. Запускает модели в правильном порядке (топологическая сортировка DAG)
  3. Поддерживает несколько стратегий материализации (view, table, incremental, ephemeral)
  4. Декларативно описывает тесты в YAML
  5. Генерирует документацию + lineage диаграммы из кода
  6. Управляет средами (dev/prod) через profiles.yml
  7. Поддерживает шаблонизацию через Jinja (циклы, условия, макросы)
NOTE

dbt НЕ загружает данные. Это типичный источник путаницы. Загрузкой данных из source-систем в warehouse занимаются отдельные инструменты: Fivetran, Airbyte, Singer, custom Python jobs. dbt начинает работу с того момента, когда raw данные уже в warehouse.

Под капотом dbt делает очень простую штуку:

# Псевдокод того, что делает dbt при `dbt run`:
for model in topological_sort(parse_dag()):
    compiled_sql = jinja_render(model.sql)
    if model.materialization == "view":
        warehouse.execute(f"CREATE OR REPLACE VIEW {model.name} AS {compiled_sql}")
    elif model.materialization == "table":
        warehouse.execute(f"CREATE OR REPLACE TABLE {model.name} AS {compiled_sql}")
    elif model.materialization == "incremental":
        ... # сложнее, но в основе тот же CREATE/MERGE

Главное «волшебство» dbt — ref(). Когда вы пишете внутри models/marts/orders.sql:

SELECT *
FROM {{ ref('stg_orders') }}
WHERE order_date >= '2026-01-01'

dbt при компиляции делает три вещи:

  1. Подставляет полное имя таблицыdatabase.schema.stg_orders — в зависимости от target environment (dev/prod)
  2. Записывает ребро в DAG: orders зависит от stg_orders
  3. Гарантирует порядок выполнения: stg_orders будет построен раньше orders

Это превращает разрозненные SQL-файлы в связный граф. Когда вы добавляете новую модель — DAG обновляется автоматически. Когда вы запускаете dbt run --select orders+ — dbt пересчитывает orders и всё, что зависит от него вниз.


Зачем именно SQL, а не Python

Частый вопрос джунов: «Если есть pandas/Spark, зачем учить отдельный SQL-инструмент?» Несколько причин, по которым dbt-SQL стал стандартом:

  1. SQL — уже декларативный язык. Вы пишете «что должно быть в результате», а оптимизатор warehouse решает «как». Это снимает огромный класс ошибок.
  2. Warehouse-движки заточены на SQL. Snowflake/BigQuery/Redshift/Databricks за 20 лет научились исполнять SQL в десятки раз эффективнее, чем тот же код в pandas-DataFrame.
  3. SQL знают аналитики. Это снимает разрыв между «инженерами» и «аналитиками» — они работают на одном языке.
  4. SQL легче ревьюить. Прочитать 100 строк SQL проще, чем 100 строк Spark на Scala.
  5. SQL portable между warehouses. dbt-модель на Snowflake и dbt-модель на BigQuery различаются в основном диалектными нюансами; код Spark не переносится в SQL warehouse вообще.

dbt поддерживает и Python-модели (models/*.py) на адаптерах, которые умеют Python execution (Snowpark, BigQuery Python, Spark/Databricks, dbt-duckdb). Но это для случаев, где SQL действительно не подходит: ML inference, сложные numerical computations, использование Python-библиотек. Для типичных трансформаций — это SQL.

CTE: WITH ... AS — лестница запросов, которую dbt заменяет моделями

Junior-уровень: что вы должны вынести из этого урока

Три якорные мысли:

  1. dbt — это T в ELT. Не E (загрузка — Fivetran/Airbyte), не L (тоже отдельный инструмент), а именно T — превращение raw данных в clean/modeled таблицы внутри warehouse.

  2. Analytics engineer — это роль, а не должность. В малой команде один человек может играть все роли; в средней-большой это отдельная позиция. dbt — основной инструмент этой роли.

  3. Главная ценность dbt — ref() и DAG. Без ref() это просто набор SQL-файлов. С ref() — связный граф зависимостей, который dbt сам топологически сортирует и выполняет в правильном порядке.

TIP

Если хотите глубже понять историю — почитайте оригинальный пост 2017 года «What is a dbt?» от Tristan Handy (CEO dbt Labs). Там идея dbt объясняется в исходном контексте: «we wanted to do better data work, and SQL is the tool we had».


Попробуй сам

Откройте https://www.getdbt.com/what-is-analytics-engineering (статья от dbt Labs про роль) и сравните три задачи:

  1. «Загрузить данные из Stripe API в Snowflake каждые 6 часов»
  2. «Превратить raw.stripe_payments в analytics.fct_payments с метриками gross_revenue, net_revenue»
  3. «Сделать дашборд Tableau с MRR по неделям»

Какую из них делает data engineer, какую analytics engineer, и какую analyst/BI? Ответ — в порядке: engineer -> analytics engineer -> analyst. Понимание этого разделения — основа всех следующих модулей курса.


Проверка знанийKnowledge check
В чём ключевое отличие ELT от ETL и почему оно стало возможным только в эпоху облачных warehouses?
ОтветAnswer
В ELT (Extract-Load-Transform) трансформации происходят ВНУТРИ warehouse через SQL, тогда как в ETL они делаются вне warehouse — в Python/Spark, и в warehouse попадают уже готовые таблицы. ELT стал возможен, когда облачные columnar warehouses (Snowflake, BigQuery, Redshift) стали достаточно дешёвыми и быстрыми, чтобы хранить сырые данные и пересчитывать большие объёмы за минуты. Это сместило место выполнения трансформаций из отдельной compute-инфраструктуры в сам warehouse, что создало нишу для роли analytics engineer и инструмента dbt — которые работают целиком на SQL внутри warehouse, без отдельного движка трансформаций.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 6. Чем ELT принципиально отличается от ETL?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3