Основные концепции
Семантический слой состоит из четырех основных компонентов, которые вы настраиваете декларативно в YAML-конфигах, и одного центрального движка, который автоматически генерирует оптимизированный SQL.
Что вы настраиваете:
- Настройте источники данных (Sources) для определения SQL-запросов к DWH.
- Используйте обогащения (Enrichments) для добавления колонок через LEFT JOIN.
- Опишите способы расчета метрик (Metrics) через фильтры, агрегации и отношения.
- Определите доступные разрезы (Dimensions) для группировки данных.
Что происходит на стороне Trisigma:
- Движок Trisigma Semantic Engine анализирует конфигурации и генерирует SQL.
- Обогащения данных (Enrichments) применяются только при необходимости.
- SQL-запросы оптимизируются для эффективного выполнения.
- Метрики становятся доступны в аналитических отчетах, M42 и витринах данных.
Ниже показана полная картина того, как компоненты связаны между собой:
Структура репозитория
Репозиторий ab-metrics имеет следующую структуру папок:
ab-metrics/
├── sources/
│ ├── sql/ # SQL-запросы источников данных
│ │ ├── buyer_stream.sql
│ │ ├── seller_stream.sql
│ │ └── ...
│ └── sources.yaml # Конфигурация источников с метаданными
│
├── enrichments/ # YAML-файлы с enrichments
│ ├── buyer_segment.yaml
│ ├── traffic_source.yaml
│ └── ...
│
├── metrics/ # YAML-файлы с метриками
│ ├── buyer_stream.yaml
│ ├── conversion.yaml
│ └── ...
│
└── dimensions/
├── sql/ # SQL-справочники для dimensions
│ ├── platform.sql
│ ├── vertical.sql
│ └── ...
└── dimensions.yaml # Конфигурация dimensions с метаданными
Связи между файлами:
- Конфигурация в
sources/sources.yamlссылается на SQL-файлы вsources/sql/и настройки метрик вmetrics/. - Обогащения из
enrichments/применяются к источнику автоматически при совпадении ключаjoin_key. - Метрики в папке
metrics/используют колонки из источников данных и обогащений. - Разрезы в
dimensions/dimensions.yamlссылаются на SQL-справочники вdimensions/sql/.
Источники данных
Источник (Source) представляет собой SQL-запрос и метаданные в sources.yaml. Они описывают способ извлечения исходных данных из DWH. Результатом работы является таблица фактов, содержащая события, даты, идентификаторы пользователей и разрезы.
# sources.yaml
buyer_stream:
sql: buyer_stream
metric_configs: [buyer_stream]
connections: [trino]
participant: { visitor: cookie_id, user: user_id }
dtm: event_date
-- sources/sql/buyer_stream.sql
SELECT cookie_id, event_date, eid, platform_id, events_count
FROM dwh.events
WHERE event_date BETWEEN :first_date AND :last_date
Обогащение данных
Enrichments добавляют новые колонки к source двумя способами:
1. Табличные enrichments (LEFT JOIN)
Обогащают данные через JOIN с другой таблицей. Например, добавление сегмента покупателя или источника трафика.
# enrichments/buyer_segment.yaml
buyer_segment_cookie:
sql: |
SELECT cookie_id, event_date, buyer_segment
FROM dma.v_buyer_segments
WHERE {{ pushdown_filter(cookie_id='cookie_id') }}
join_key: [cookie_id, event_date]
2. Calculated fields (вычисляемые поля)
Создают новые колонки на основе существующих через SQL-выражения, без JOIN.
# enrichments/calculated_fields.yaml
calculated_fields:
is_mobile: "platform_id IN (4, 14)"
price_bucket: |
CASE
WHEN price < 1000 THEN 'low'
WHEN price < 10000 THEN 'medium'
ELSE 'high'
END
Автоматическое применение:
Никаких явных связей настраивать не нужно. Enrichment становится доступен автоматически, если:
- Для табличных обогащений в источнике должны присутствовать все колонки из
join_key. - Для вычисляемых полей в источнике должны быть доступны все колонки из SQL-выражения.
Обогащение применяется только в том случае, если его колонки задействованы в запрошенных метриках или разрезах.
Обогащенный источник
Вы настраиваете источники и обогащения, а обогащенный источник (Enriched Source) формируется автоматически. Обогащения добавляются в SQL только при использовании соответствующих колонок. Это исключает избыточные JOIN-соединения.
-- Enriched Source (концептуально)
WITH enriched AS (
SELECT
s.*, -- Исходные колонки
bs.buyer_segment -- Добавленная колонка (только если нужна)
FROM source s
LEFT JOIN buyer_segments bs -- Только если buyer_segment используется
ON s.cookie_id = bs.cookie_id
)
SELECT ... FROM enriched -- Metrics и Dimensions читают отсюда