GH GambleHub

Слияние данных из разных источников

Слияние данных из разных источников

Слияние данных — это процесс объединения разнородных потоков (БД продуктов, CRM, платежные провайдеры, логи событий, сторонние реестры) в целостные сущности и консистентные витрины. Цель — получить «золотую запись» (Golden Record) и согласованные разрезы для аналитики, ML и операционных кейсов.

1) Типовые сценарии и цели

360° по сущности: клиент/игрок, устройство, платежный инструмент, мерчант.
Консолидация транзакций: несколько PSP/касс → единый журнал с обязательной идемпотентностью.
Нормализация событий: веб/мобайл/бэкенд-логи → единый словарь событий.
Обогащение: внешние справочники (гео, FX, AML/санкции, маркетинговые источники).
Единые метрики: согласование валют/таймзон, схем и кодировок.

2) Контракты источников и схемы

Перед началом — контракт данных на каждый источник:
  • Схема: поля, типы, нуллабельность, ключ(и), домены значений.
  • Семантика: что означает каждое поле (словари).
  • SLA: свежесть/частота, максимальная задержка и out-of-order.
  • Эволюция: политика изменения схем (backward/forward), deprecation.
  • Качество: уникальность ключей, допустимые диапазоны, референциальная целостность.

3) Идентификация: ключи и сопоставление (record linkage)

3.1. Жесткие идентификаторы

Естественные ключи: `user_id`, `transaction_id`, `device_id`, `iban`.
Прокси-ключи: e-mail/телефон (с нормализацией: регистр, пробелы, коды стран).
Суррогаты: `surrogate_id` в хаб-таблицах при отсутствии универсального ключа.

3.2. Мягкие правила сопоставления

Детерминированные: точное совпадение нормализованного e-mail + ДР; «дом»/«моб» телефон → E.164.
Вероятностные (фаззи): Jaro-Winkler/Levenshtein для имени/адреса, TF-IDF/эмбеддинги для строк, «блокировка» (blocking) по грубым хэшам/префиксам для ускорения.
Графовые подходы: сущности как узлы, совпадения как ребра; кластеризация компонент связности.
Стратегия «step-up»: от строгих к мягким правилам с ручной ревью «на границе».

3.3. Правила консолидации (survivorship)

Приоритет источника: «KYC-реестр > CRM > логи», когда есть конфликт значений.
Свежесть: более новая метка времени побеждает (с поправкой на достоверность).
Заполненность: prefer non-NULL; слияние адресов/тегов объединением множеств.
Аудит: сохраняйте «след решения» — что перезаписали и почему.

4) Дедупликация и MDM

MDM-слой (Master Data Management): таблицы «мастер-сущностей» + связи «источник→мастер».
Golden Record: агрегированная запись с полем `confidence`/источником правды.
История: SCD-тип 2 для атрибутов, зависящих от времени (адрес, статус KYC).
Идентичности: таблицы мерджей (merge map) с датами «слияния»/«расплитования».

5) Потоки изменений: CDC, опоздавшие и дубликаты

CDC (Change Data Capture): события `insert/update/delete` + `source_lsn`/offset.
Опоздавшие события: водяные метки (watermarks) и окна ожидания (grace period), хранение поздних апдейтов для корректировок.
Out-of-order: сортировка по ключу и времени, компенсирующие апдейты.
Дубликаты: идемпотентные ключи (`event_id`, `idempotency_key`), дедуп в окне.
Exactly-once: транзакционные сингс/стор, `MERGE` с детерминированной логикой.

6) Таймзоны, валюты и календарь

Время: хранить в UTC + локализованные срезы; явно хранить `ingested_at` и `event_time`.
Валюты: хранить «сырую валюту» и нормализованную `base_ccy` с курсом на дату операции.
Календари: таблицы праздников/рабочих дней по регионам для честных сравнений.

7) Псевдо-SQL для слияния (upsert/merge)

7.1. Транзакции (идемпотентный журнал)

sql
MERGE INTO fact_transactions t
USING staging_transactions s
ON t. txn_id = s. txn_id
WHEN MATCHED AND s. updated_at > t. updated_at THEN
UPDATE SET amount = s. amount,
currency = s. currency,
status = s. status,
updated_at = s. updated_at
WHEN NOT MATCHED THEN
INSERT (txn_id, user_ext_id, amount, currency, status, event_time, updated_at)
VALUES (s. txn_id, s. user_ext_id, s. amount, s. currency, s. status, s. event_time, s. updated_at);

7.2. «Золотая запись» пользователя (приоритет источника + свежесть)

sql
WITH ranked AS (
SELECT s. ext_user_id,
s. norm_email,
s. phone_e164,
s. addr_struct,
s. source,
s. updated_at,
ROW_NUMBER() OVER (
PARTITION BY s. ext_user_id
ORDER BY
CASE s. source
WHEN 'KYC' THEN 1 WHEN 'CRM' THEN 2 ELSE 3 END,
s. updated_at DESC
) AS rn
FROM staging_users s
)
MERGE INTO dim_user_golden g
USING ranked r
ON g. ext_user_id = r. ext_user_id
WHEN MATCHED AND r. rn = 1 THEN
UPDATE SET email = COALESCE(r. norm_email, g. email),
phone = COALESCE(r. phone_e164, g. phone),
address = COALESCE(r. addr_struct, g. address),
source_of_truth = r. source,
updated_at = r. updated_at
WHEN NOT MATCHED AND r. rn = 1 THEN
INSERT (ext_user_id, email, phone, address, source_of_truth, updated_at)
VALUES (r. ext_user_id, r. norm_email, r. phone_e164, r. addr_struct, r. source, r. updated_at);

8) Качество и тестирование

Схема-тесты: обязательные поля, типы, домены.
Логика-тесты: уникальность ключа, отсутствие дубликатов, нет «назад во времени».
Сверки (reconciliation): суммы по источнику vs итоговая витрина; расхождения → тикеты.
Профилирование: распределения, доля NULL, «длинные хвосты».
Метрики слияния: precision/recall сопоставления, доля «CONFLICT», % записей с confidence ≥ порога.

9) Наблюдаемость и SLO

SLO свежести: лаг витрин ≤ N минут/часов; мониторинг задержек и backlog.
Алерты: рост дубликатов, всплеск конфликтов, падение coverage ключей.
Логи lineage: из какого источника взяли поле, когда и кем перезаписано.
Рунибуки: сценарии инцидентов (опоздавшие партии, шторма CDC, неверный FX).

10) Безопасность, приватность, комплаенс

PII: псевдонимизация, хэширование идентификаторов, маскирование в BI.
RLS/CLS: доступ по ролям и строкам; экспорт — с токенами и сроком годности.
Срок жизни данных: графики хранения; право на удаление (DSAR) и «legal hold».
Анти-соединение (re-identification): правила минимизации джойнов чувствительных таблиц.

11) Организация моделей и данных

Слои: `raw` (как есть) → `staging` (очистка/нормализация) → `core` (мастер-сущности, факт/измерения) → `marts` (витрины под аналитику/ML).
SCD: тип 2 для атрибутов, тип 1 — для исправления ошибок; явные `valid_from/valid_to`.
Feature Store: функции преобразований идентичны онлайн/офлайн; point-in-time корректность.

12) Паттерны реализации

ELT с семантическим слоем: логика слияния описана декларативно (правила, приоритеты, ключи).
Стрим + микробатч: для near-real-time витрин — микробатчи 1–15 мин с watermarks.
Graph-linkage: отдельный граф-хаб для сложной идентификации (девайсы, карты, адреса).
Step-up валидация: новые правила linkage включать в shadow-режиме, собирать метрики точности.

13) Чек-лист перед релизом контура слияния

  • Контракты источников подписаны; схемы и словари полей согласованы
  • Определены ключи/правила linkage; есть стратегия дедупликации
  • Заданы правила survivorship и приоритеты источников; аудит-лог включен
  • CDC/идемпотентность/обработка поздних данных реализованы
  • Валюты/таймзоны/календарь нормализованы
  • Тесты качества и сверки настроены; дашборды наблюдаемости есть
  • SLO свежести и доступности зафиксированы; алерты и рунибуки готовы
  • PII/доступы/хранение соответствуют требованиям комплаенса
  • Документация: паспорт сущности, схема lineage, примеры запросов

14) Паспорт «золотой записи» (шаблон)

Сущность: `USER_GOLDEN`

Ключ: `user_master_id` (surrogate), мэппинги `source_user_id[]`

Поля и правила:
  • `email`: нормализация + приоритет `KYC > CRM > LOGS`
  • `phone`: нормализация E.164, сплит по верификации
  • `name`: Jaro-Winkler ≥ 0.92, fallback — источник «KYC»
  • `address`: составной объект; объединение + приоритет свежести
  • История: SCD2 (`valid_from/valid_to`)
  • Lineage: ссылочный список полей-доноров
  • Качество: coverage≥98%, дубликаты≤0.3%
  • SLO: свежесть ≤ 1 ч, доступность ≥ 99.9%
  • Владельцы: Data Platform, KYC/AML
  • Риски: коллизии имен, «семейные» телефоны, shared-devices

15) Итоги и рекомендации

Слияние — это не только «JOIN по ключу», а контур: контракты источников → идентификация и дедуп → приоритеты и «золотая запись» → CDC и опоздавшие → качество и наблюдаемость → безопасность и история изменений.
Стройте правила прозрачно, храните аудит каждого решения, поддерживайте SCD и exactly-once. Так данные из десятков источников превращаются в надежные витрины и устойчивые метрики для продукта, аналитики и ML.

Contact

Свяжитесь с нами

Обращайтесь по любым вопросам или за поддержкой.Мы всегда готовы помочь!

Telegram
@Gamble_GC
Начать интеграцию

Email — обязателен. Telegram или WhatsApp — по желанию.

Ваше имя необязательно
Email необязательно
Тема необязательно
Сообщение необязательно
Telegram необязательно
@
Если укажете Telegram — мы ответим и там, в дополнение к Email.
WhatsApp необязательно
Формат: +код страны и номер (например, +380XXXXXXXXX).

Нажимая кнопку, вы соглашаетесь на обработку данных.