Обогащение данных
1) Назначение и бизнес-ценность
Обогащение превращает «сырые» события в полезные факты, добавляя контекст и признаки:- Финансы/отчетность: fx-нормализация сумм, привязка к рынкам/налоговым ставкам, расчет GGR/NGR.
- Комплаенс/AML/RG: скоринги риска, санкционные/PEP-метки, RG-лимиты, поведенческие признаки.
- Маркетинг/продукт: источники трафика, сегменты, миссии/квесты, персонализация.
- SRE/операции: гео/ASN для трафика, тип клиента/устройства, фичфлаги и релизы.
Ключевой результат — повышение точности моделей, качество отчетов и скорость принятия решений.
2) Обогащающие источники (примерный каталог)
Референс/каталоги: игры, провайдеры, рынки/юрисдикции, валюты, налоговые таблицы, календарь праздников.
KYC/KYB/RG: уровни проверки, статусы, самоисключения, лимиты, возрастные группы.
AML/санкции/PEP: хиты скрининга, списки, уровни риска.
Сети и устройства: IP→гео/ASN, устройство/OS/браузер, device fingerprint.
Платежные провайдеры (PSP): BIN-таблицы, методы, MCC, риск-метки.
FX/время: курсы валют на дату события, локальные часовые пояса/DST.
Контент и маркетинг: источники/кампании/UTM, аффилиаты, сегменты.
Модели и эвристики: предобученные скоринги, эмбеддинги, категориальные маппинги.
3) Типы обогащения
Lookup-джойн: точечное сопоставление по ключу (game_id, BIN, ip_range, user_pseudo_id).
Dimension attach: присоединение измерений (dim.) к фактам.
Derived fields: вычисляемые колонки (amount_base, local_time, tax_rate).
Aggregations/velocity: счетчики за окна (N ставок/мин, сумма депозитов/час).
Risk/behavioral features: «время с последнего события», share-of-wallet, ночная активность.
Geo/ASN/Device: код страны, регион, оператор, тип устройства/браузера.
Semantic mappings: классификация провайдеров/игр, кластеры игроков.
ML-фичи: признаки для онлайн/офлайн моделирования (Feature Store).
4) Где обогащать: Batch vs Stream
Stream (real-time): антифрод, RG-триггеры, алерты SRE — задержки p95 ≤ 2–5 с; lookup в кэши (Redis/Scylla), асинхронные запросы к провайдерам с таймаутами.
Batch (микро-батчи/ежедневно): витрины Gold (GGR/RG/AML), сверки, отчеты — стабильность и полнота важнее латентности.
Гибрид: быстрый онлайн-признак + ночное переобогащение (reconciliation/accuracy).
5) Архитектурный референс
1. Bronze — сырые события (append-only).
2. Silver (clean/conform) — нормализация, ключи, первичные lookup’и (fx, geo, dim.).
3. Enrichment Layer — расширенные признаки, агрегаты окон, риск-метки.
4. Feature Store — регистр признаков (онлайн/офлайн согласованность).
5. Gold — витрины под BI/регуляторку/модели; неизменяемые артефакты.
6. Сервисы — API/GraphQL, отчетные экспорты, real-time алерты.
Компоненты: Kafka/Redpanda, Flink/Spark/Beam, Redis/Scylla (lookup), ClickHouse/Pinot (оперативное чтение), Lakehouse (Delta/Iceberg/Hudi).
6) Контракты и схемы
Schema-first: `event_time`, `schema_version`, стабильные ключи (user_pseudo_id, game_id, transaction_id).
Отметки обогащения: `enrichment.version`, `enrichment.sources`, `fx_source`, `geo_source`, `model_version`.
Версионирование: новые признаки добавляются как nullable; breaking-изменения — через `/v2` и двойную запись.
7) Примеры обогащения (SQL/псевдокод)
7.1 FX-нормализация и локальное время
sql
SELECT p.transaction_id,
p.amount_orig,
p.currency,
r.rate AS fx_rate_used,
p.amount_orig r.rate AS amount_base,
p.event_time,
convert_timezone(m.tz, 'UTC', p.event_time) AS local_time,
r.fx_source
FROM bronze.payment_events p
JOIN dim.fx_rates r
ON r.date = DATE(p.event_time) AND r.ccy_from = p.currency AND r.ccy_to = 'EUR'
JOIN dim.markets m ON m.code = p.market;
7.2 Geo/ASN по IP (псевдокод)
python geo = geo_db.lookup(ip)
asn = asn_db.lookup(ip)
record["geo_country"] = geo.country record["asn"] = asn.number record["enrichment"]["geo_source"] = "mmdb:2025-10-01"
7.3 Оконные признаки скорости депозитов (stream)
sql
SELECT user_pseudo_id,
TUMBLE_START(event_time, INTERVAL '10' MINUTE) AS win_start,
COUNT() AS deposits_10m,
SUM(amount_base) AS deposits_sum_10m
FROM silver.payments
GROUP BY user_pseudo_id, TUMBLE(event_time, INTERVAL '10' MINUTE);
7.4 Сопряжение с RG-лимитами
sql
SELECT b., r.daily_deposit_limit, r.self_exclusion
FROM silver.bets b
LEFT JOIN dim.rg_limits r USING (user_pseudo_id);
8) Качество обогащения (DQ)
Минимальные правила:- FX: `fx_rate_used` не NULL, `fx_source` из whitelist, расчетная `amount_base ≥ 0`.
- Geo/ASN: доля успешных lookups ≥ 98% (по рынкам), `country` в справочнике.
- RG/AML метки: `valid_from/valid_to` (SCD II) не пересекаются; отсутствие «дыр» в истории.
- Агрегаты/окна: корректность окон (нет двойного учета), completeness ≥ 99.5%.
- Версии моделей: `model_version` присутствует, контроль дрейфа признаков.
yaml table: enriched.payments rules:
- name: fx_present type: not_null column: fx_rate_used severity: critical
- name: country_known type: in_set column: geo_country set_ref: ref.countries severity: major
- name: rg_scd_valid type: scd_validity columns: [valid_from, valid_to]
severity: major
9) Приватность и комплаенс
Минимизация PII: обогащайте по псевдо-ID, реальные идентификаторы — в отдельном контуре.
Geo-локализация и резидентность: маршрутизация по региону (EEA/UK/BR), раздельные ключи шифрования.
DSAR/RTBF: обогащенные проекции должны поддерживать «скрытие»/редакцию; храните правовое основание для исключений.
Legal Hold: заморозка удалений для отчетных артефактов/кейсов.
10) Наблюдаемость и lineage
Линедж: от сырого события → lookup/агрегаты → витрины/модели; фиксируйте версии источников (`fx_source`, `geo_source`, `bin_source`).
SLI/SLO: freshness p95 (Silver) ≤ 15 мин; успешные geo-lookups ≥ 98%; доля записей с заполненными ключевыми признаками ≥ 99%; latency enrich-стрима p95 ≤ 2–5 с.
Дашборды: тепловая карта completeness по источникам, карта версий справочников/моделей, монитор «дорогих» join’ов, дрейф признаков.
11) Стоимость и производительность
Кэши/материализация: частые lookup’и в Redis/Scylla; периодические snapshot’ы.
Компактные признаки: храните агрегаты (а не «сырые» списки); используйте Parquet/колоночные форматы.
Партиционирование: по дате/рынку/тенанту; кластеризация по часто фильтруемым полям.
Адаптивная частота: тяжелые enrich-джобы — ночами; realtime — только критичные.
Chargeback: учет cost/query и cost/GB по командам/фичам.
12) Паттерны и анти-паттерны
Паттерны:- Dimension Lookup + SCD II для RG/KYC/провайдеров.
- Async Enrichment с таймаутами и fallback (метка «unknown» + повтор).
- Feature Store с online/offline-согласованием и тестами репроходимости.
- Rule-as-Code для обогащений (пороговые/категориальные карты).
- Жесткая привязка к внешним API в горячем пути без кэша.
- Немаркированные версии источников (`fx_source`, `geo_source`).
- Денормализация «все со всем» в Silver (взрывы стоимости/сложности).
- Привнесение PII в аналитические слои.
13) Процессы и RACI
R (Responsible): Data Engineering (пайплайны enrich/stream), Domain Owners (семантика признаков), MLOps (Feature Store).
A (Accountable): Head of Data / Chief Data Officer.
C (Consulted): Compliance/Legal/DPO, Finance (FX/налоги), Risk (RG/AML), SRE.
I (Informed): BI/Продукт/Маркетинг/Операции.
14) Дорожная карта внедрения
MVP (2–4 недели):1. Каталог обогащающих источников (fx, geo, markets, RG/KYC).
2. Silver-нормализация + базовые lookup’и (fx/geo/dim.).
3. Первые агрегаты velocity (депозиты/ставки) и enriched.v1 таблицы.
4. Дашборд completeness/freshness, версии источников.
Фаза 2 (4–8 недель):- Подключение санкций/PEP/KYB, BIN-таблиц PSP, device fingerprint.
- Feature Store (ядро признаков) + онлайн-кэш, realtime-обогащение Flink.
- DQ-правила на enrich-слой, lineage и «dry-run» симуляции.
- Персонализация (миссии/квесты) и RG/AML-детекторы на онлайне.
- Управление стоимостью (квоты, материализация, Z-order), мульти-регион.
- Автогенерация документации признаков и каталога («feature cards»).
15) Чек-лист качества перед продом
- Согласованные ключи и схемы, версии источников подписаны.
- DQ-правила на fx/geo/RG/санкции/окна; алерты и SLO.
- Кэши/таймауты и fallback для внешних lookup’ов.
- Линедж и дашборды стоимости/производительности.
- Процедуры DSAR/RTBF/Legal Hold для обогащенных таблиц.
- Документация признаков (owner, формулы, SLO, влияние).
16) Частые ошибки и как их избежать
Непомеченные версии справочников/моделей: всегда фиксируйте `_source` и `model_version`.
Вычисление fx «задним числом»: используйте курс на момент события; храните источник FX.
Смешение PII: токенизируйте и изолируйте маппинги.
Двойной учет в агрегатах: проверяйте окна и дедуп.
Синхронные внешние вызовы без кэша: вводите async + кэш/ретраи.
Нет репроходимости фич: единый код трансформаций online/offline, тесты соответствия.
17) Глоссарий (кратко)
Lookup/Dimension attach — присоединение справочника к факту по ключу.
Feature Store — регистр и сервинг признаков для ML.
SCD II — историзация измерений с интервалами валидности.
FX — курсы валют и нормализация сумм.
ASN — автономная система сети; полезно для антифрода и гео-аналитики.
18) Итог
Обогащение — это дисциплина превращения событий в знания: согласованные ключи и схемы, контролируемые lookup’и и агрегаты, версионированные источники, приватность по умолчанию, DQ и наблюдаемость. Следуя описанным паттернам, вы получите воспроизводимые, экономичные и комплаентные витрины и признаки, готовые к отчетности, персонализации и real-time детекторам риска.