Медальон-архитектура на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать на собесе

Медальон — стандартный паттерн lakehouse-архитектуры. На собесе DE: «отличия слоёв», «зачем bronze, если есть source», «какие тесты на gold». Senior — нюансы time-travel, schema evolution, CDC.

Layer Bronze

Сырьё.

Что хранить:

  • Точная копия источника (или минимально трансформированная).
  • Все колонки, включая «мусорные».
  • Append-only — никогда не перезаписывать.
  • Метаданные: load_timestamp, source_file, ingest_id.

Преобразования:

  • Парсинг JSON / Avro в табличную форму.
  • Type casting (string → int / date).
  • Никакой бизнес-логики.
CREATE TABLE bronze.events (
  raw_data VARIANT,             -- raw JSON
  user_id BIGINT,
  event_at TIMESTAMP,
  ingested_at TIMESTAMP,
  source_file STRING
);

Зачем нужен. При смене бизнес-правил можно переиграть pipeline без перезагрузки источников. Пожизненный «временной снимок».

Layer Silver

Очищенный, нормализованный, joined.

Что делать:

  • Очистка (дубли, NULL, edge values).
  • Нормализация типов (timestamps в UTC, currency в основной валюте).
  • Joining с справочниками (lookup, dim).
  • SCD2 для изменяющихся атрибутов.
  • Идемпотентность (можно перезапустить без поломки).

Чего не делать:

  • Бизнес-агрегаций (это gold).
  • Отчётной денормализации.
CREATE TABLE silver.events (
  event_id STRING,
  user_id BIGINT,
  user_country STRING,        -- joined FROM dim_user
  event_type STRING,
  event_at TIMESTAMP,         -- UTC
  amount_usd DECIMAL,         -- normalized
  device_type STRING,
  is_test BOOLEAN
);

Silver — «source of truth» для аналитики и ML. Большинство downstream читает отсюда.

Layer Gold

Витрины для бизнеса.

Что делать:

  • Star schema или denormalized (под конкретные dashboard'ы).
  • Pre-aggregations (DAU, weekly revenue).
  • Бизнес-метрики, KPIs.
  • Оптимизировано под BI-производительность.
CREATE TABLE gold.daily_revenue (
  DATE DATE,
  country STRING,
  product_category STRING,
  revenue_usd DECIMAL,
  orders_count BIGINT,
  unique_users BIGINT
);

Gold-таблиц обычно меньше, чем silver — каждая под конкретное потребление (Tableau dashboard, ML feature, ad-hoc анализ).

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Тесты на каждом уровне

Bronze:

  • Row count > 0 (источник не пустой).
  • Schema match (новых колонок нет / есть).
  • Freshness (свежесть load).

Silver:

  • Uniqueness (PK constraint).
  • Not null (NOT NULL обязательных).
  • Referential integrity (FK существуют).
  • Accepted values (status в enum).

Gold:

  • Business rules (revenue > 0).
  • Reconciliation (sum по dim'ам = total в fact).
  • Sanity (DAU < users count).
  • Custom metrics (соответствие историческим трендам).

В dbt — tests/, в Great Expectations / Soda — отдельные suites. Запускать на каждом dbt run.

Data contracts

Современная практика — explicit data contracts между layers.

Контракт описывает:

  • Schema (колонки, типы).
  • Constraints (PK, FK, NOT NULL).
  • Freshness SLA (silver обновляется каждые 6 часов).
  • Quality SLA (uniqueness ≥ 99.9%).
  • Versioning (semver).

Tools: Soda Contracts, Great Expectations, dbt schema, Apache Avro Schema Registry.

Контракты особенно важны на границе bronze ↔ source (provider'ом не контролируется) и silver ↔ gold (consumer'ы downstream).

Частые ошибки

Skip bronze. Сразу пишем silver — теряем возможность переиграть.

Деформировать bronze. Бизнес-правила в bronze = пайплайн ломается при изменении правил.

Slid silver и gold. Если в silver уже агрегации — gold становится копией. Граница потеряна.

Тесты только на gold. Ошибки замечают на финале — пайплайн уже залил мусор.

Не вести lineage. В медальоне особенно важно знать, какая колонка из какой таблицы.

One-shot rebuild каждого слоя. Incremental на bronze, silver, gold — must-have для production.

Игнорировать time-travel. Iceberg / Delta дают версионирование таблиц — крайне полезно для audit и rollback.

Связанные темы

FAQ

Bronze — это data lake?

Часто да. Bronze может быть в S3 / GCS (parquet / Iceberg / Delta). Silver / Gold — внутри DWH (Snowflake / Databricks / CH).

Сколько слоёв оптимально?

3 (bronze / silver / gold) — стандарт. Иногда дополнительный слой (raw, archive). Не более 5.

Можно ли пропустить silver?

Для маленьких pipeline'ов (1-2 источника, известная схема) — да, ETL-style напрямую в gold. На сложных — silver важен.

Это официальная информация?

Нет. Статья основана на материалах Databricks (medallion architecture), dbt Labs, Lakehouse pattern.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.