Enrichments (обогащения)
Enrichments. автоматическое добавление колонок к источникам данных. Описываются один раз, применяются везде где нужны.
Система enrichments добавля ет колонки двумя способами:
- Табличные enrichments. через LEFT JOIN с внешними таблицами
- Calculated fields. через скалярные SQL выражения
Зачем?
В компании есть множество источников метрик, и аналитики постоянно добавляют к ним одни и те же разрезы (источники трафика, сегменты пользователей, геолокация и т.д.), дублируя SQL код.
Система обогащений централизует эту бизнес-логику, позволяя:
- Переиспользовать SQL-код в любых источниках
- Быстрее добавлять новые разрезы и поля для метрик
- Оптимизировать вычисления: система не будет джойнить то, что не нужно в конкретной задаче
Без enrichments:
-- Source A
SELECT e.*, bs.buyer_segment
FROM events e LEFT JOIN buyer_segments bs ON e.cookie_id = bs.cookie_id
-- Source B (тот же JOIN продублирован)
SELECT c.*, bs.buyer_segment
FROM clicks c LEFT JOIN buyer_segments bs ON c.cookie_id = bs.cookie_id
С enrichments:
# enrichments/buyer_segment.yaml - описали один раз \{#enrichments-buyer-segment-yaml-opisali-odin-raz}
buyer_segment_cookie:
sql: SELECT cookie_id, buyer_segment FROM dma.v_buyer_segments
join_key: [cookie_id]
Обогащение будет доступно автоматически во всех источниках с cookie_id.
Табличные Enrichments
Добавление колонок через LEFT JOIN с внешними таблицами.
Структура
enrichment_name:
sql: |
SELECT join_key, additional_columns
FROM table
WHERE {{ pushdown_filter(key='key') }}
and event_date between :first_date and :last_date
join_key: [columns]
default_values: # Опционально
column: value
Ключевые механизмы
1. Автоматическое применение и цепочки
Enrichment применяется автоматически, если в source или других enrichments есть все колонки из join_key:
buyer_segment_cookie:
join_key: [cookie_id, event_date] # Применится если есть cookie_id и event_date
Цепочки enrichments:
Enrichments могут использовать колонки друг друга. Система автоматически определяет порядок через граф зависимостей:
# enrichments/user_profile.yaml
user_profile:
sql: SELECT user_id, region_id FROM ...
join_key: [user_id]
# enrichments/region_info.yaml
region_info:
sql: SELECT region_id, region_name FROM ... # Использует region_id из user_profile
join_key: [region_id]
Порядок джоинов определяется автоматически: сначала user_profile, затем region_info.
2. Pushdown Filter
Макрос для оптимизации. добавляет фильтр внутрь запроса enrichment по уникальным значениям из source:
WHERE {{ pushdown_filter(cookie_id='cookie_id') }}
Генерирует:
WHERE cookie_id IN (SELECT DISTINCT cookie_id FROM source_data WHERE cookie_id IS NOT NULL)
Оптимизация уменьшает объем данных в JOIN в правой таблице, что благосклонно сказывается на времени выполнения и потребляемой памяти.
Синтаксис:
# Один ключ \{#odin-klyuch}
WHERE {{ pushdown_filter(cookie_id='cookie_id') }}
# Несколько ключей \{#neskol-ko-klyuchey}
WHERE {{ pushdown_filter(cookie_id='cookie_id', user_id='user_id') }}
Имя аргумента - это называние поля из join_key, а значение - это колонка, которая существует в контексте sql-запроса.
3. Default Values
Заполняет NULL через COALESCE:
traffic_source_cookie:
sql: SELECT cookie_id, source_name, is_paid FROM ...
join_key: [cookie_id]
default_values:
source_name: "organic"
is_paid: false
4. Параметр гранулярности
Enrichment может зависеть от гранулярности расчета :granularity.
Например, для расчетов m42 с месячной гранулярностью.
weekly_user_activity:
sql: |
SELECT
user_id,
DATE_TRUNC(:granularity, event_date) as metric_date,
AVG(activity_score) as avg_activity
FROM dma.user_activity
WHERE {{ pushdown_filter(user_id='user_id') }}
GROUP BY user_id, DATE_TRUNC(:granularity, event_date)
join_key: [user_id, metric_date]
Система подставит правильное значение гранулярности ('day', 'week', 'month') в зависимости от требований расчета.
Важно! Если используется granularity, то колонка с датой должна называться metric_date. зарезервированное имя специально для этих целей.