Тарихи деректермен жұмыс
1) Мақсаты және қағидаттары
Мақсаты: өткен жағдайларды есептерді, модельдер мен тексерулерді қайталанатындай, дәл және комплаентті болатындай етіп сақтау және өңдеу.
Принциптері:- Time-aware by design: схемалар мен сұраулардағы анық уақыт үлгілері.
- Reproducibility: D күні үшін бір есеп әрқашан бірдей нәтиже береді.
- Auditability: дәлелденетін шығу тегі (lineage), өзгермейтін қабаттар, қажет болған жерде WORM.
- Cost-aware: мұрағаттық қабаттар, компрессия, түсінікті SLA бар cold storage.
- Privacy-by-design: ретроспективті операциялар мен құқықтық сұраулар кезінде PII басқару.
2) Уақыт модельдері
Event-time: нақты оқиғаның уақыты (мөлшерлеме, депозит).
Processing-time: Жүйе жазбаны өңдегенде (өзгеше болуы мүмкін).
Bitemporal: event- және processing-уақытын сақтау.
validity-интервалдар: 'valid _ from', 'valid _ to', 'is _ current'.
As-of queries: «T сәтінде білетіндей» деректерді іріктеу.
sql event_time TIMESTAMP, -- event time processed_at TIMESTAMP, -- TIMESTAMP valid_from processing time, -- start of version validity valid_to TIMESTAMP, -- end of validity (NULL if current)
is_current BOOLEAN
3) Сақтау қабаттары мен форматтары
Lakehouse: Bronze (raw append-only) → Silver (clean/SCD/қалыпқа келтіру) → Gold (витриналар).
ACID-форматы: Delta/Iceberg/Hudi (MERGE/Upsert, time-travel, snapshots).
Tiered storage: hot/warm/cold + WORM реттеуші артефактілер үшін.
Партиялану: 'event _ date', 'market', 'tenant'; кластерлеу/жиі предикаттар бойынша Z-order (user/game/provider).
4) Өлшемдерді тарихтау (SCD)
SCD I: критикалық емес түзетулер үшін қайта жазу.
SCD II: толық тарихы; RG/KYC/трафик арналары/ойын атрибуттары үшін ұсынылады.
SCD III: «дейін/кейін» - сирек кездесетін салыстыру кейстері.
sql
MERGE INTO dim. users_scd t
USING stage. users u
ON t. user_pseudo_id = u. user_pseudo_id AND t. is_current = TRUE
WHEN MATCHED AND (t. rg_status <> u. rg_status OR t. country <> u. country) THEN
UPDATE SET is_current = FALSE, valid_to = CURRENT_TIMESTAMP
WHEN NOT MATCHED THEN
INSERT (user_pseudo_id, country, rg_status, valid_from, valid_to, is_current)
VALUES (u. user_pseudo_id, u. country, u. rg_status, CURRENT_TIMESTAMP, NULL, TRUE);
5) Фактілер тарихы: суреттер және bitemporal
Түсірілімдер (snapshots): күн/ай соңындағы агрегаттардың түсірілімі (мысалы, әмиян балансы) - тарихи есептердің қайта құрылуын жеделдетеді.
Bitemporal фактілер: кеш түзетулерді ретроспективті есептеулерден ажырату үшін event-time және processing-time тіркейміз.
Exactly-once тарихы: 'event _ id' бойынша дедуп + іспеттес MERGE.
6) Time-travel және жаңғыртылуы
Time-travel: түзету, инциденттер, салыстыру үшін «Т сәтінде» кестелерін оқу.
Логиканы нұсқалау: трансформация артефактілері (SQL/DBT, контейнерлер нұсқалары) және шығу кестелеріндегі «logic_version» белгілері.
Frozen outputs: Gold есептілік артефактілері тіркеледі және қайта жазылмайды, hash және экспорт журналы қол жетімді.
sql
SELECT
FROM silver. fact_bets VERSION AS OF 1678901234567
WHERE event_date = DATE '2025-10-31';
7) Backfill и Reprocessing
Backfill: бастапқы/толық жүктеу тарихи ауқымы.
Reprocessing: қателерді түзеткеннен немесе бизнес ережелерін ауыстырғаннан кейін қайта есептеу.
- Өлшемдерді салыстыра отырып, «күңгірт жүгіру» (dry-run), (MERGE/upsert), диапазондар, квоталар.
- Нәтижені таңбалаймыз: 'recalc _ reason', 'logic _ version', 'reprocessed _ at'.
1. Freeze ағымдағы Gold; 2) DLQ/DQ тексеру; 3) Silver прогоны; 4) метриктерді салыстыру; 5) Gold қайта жинау; 6) жариялау және қол қою.
8) Дәлдікті салыстыру (reconciliation)
Бақылау сомалары: айналымдарды/сандарды OLTP, PSP/провайдерлермен салыстыру.
Екі контурлы тексеру: іріктемедегі тәуелсіз pipeline (A/B салыстыру).
Шектеулер: мысалы, GGR ≤ 0 алшақтығы. Күніне 2%.
sql
-- Duplicates
SELECT transaction_id, COUNT() c
FROM silver. payments
GROUP BY transaction_id
HAVING COUNT() > 1;
-- Unknown Currencies/Markets
SELECT p. currency
FROM silver. payments p
LEFT JOIN ref. currencies r ON r. code = p. currency
WHERE r. code IS NULL;
9) Валюталар, уақыт, күнтізбе: тарихи дұрыстығы
Оқиға күніне FX: 'fx _ rate _ used' және 'fx _ source'.
Нарықтың жергілікті уақыты: DST/таймзондтар күнтізбелер анықтамалығы арқылы.
Мерекелер/маусымдық: күнтізбенің жеке кестесі, модельдер мен есептерде пайдаланылады.
sql
SELECT p. transaction_id,
p. amount_orig,
r. rate AS fx_rate_used,
p. amount_orig r. rate AS amount_base,
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';
10) PII, комплаенс және Legal Hold
PII-азайту: бүркеншік атау, жеке қорғалған маппинг.
DSAR/RTBF: есептелетін проекциялар және тарихи қабаттарды селективті редакциялау; сақтаудың заңды міндеті бойынша ерекшеліктер құжатталады.
Legal Hold: есептік артефактілерге арналған WORM диапазондарына/объектілеріне алып тастауды «қатыру» жалаулары.
Аудит: қолжетімділік пен экспорттың өзгермейтін логтары.
11) DQ және тарих үшін сызық
DQ-код ретінде (мысал):yaml table: silver. fact_bets slo:
completeness_percent: 99. 5 freshness_minutes: 60 rules:
- name: unique_bet type: unique columns: [bet_id]
severity: critical
- name: market_known type: in_set column: market set_ref: ref. markets
- name: ts_in_range type: temporal expression: "event_time BETWEEN date_sub(now(), interval 5 year) AND now()"
Lineage: кіріс/трансформация/шығыс нұсқаларын тіркейміз; тәуелділіктер бағаны кері өзгерістерге міндетті.
12) Өнімділік және құн
Партиялануы: күні/нарығы/теңгерімі бойынша; егер жиі сүзгілесек 'user _ pseudo _ id '/' game _ id' бойынша агрессивті кластерлеу.
Форматтар: Parquet + статистика/компрессия; тұрақты VACUUM/OPTIMIZE.
Материалдандыру: «қымбат» тарихи агрегациялар үшін precompute; тоқсан сайынғы/жылдық есептілік үшін снапшоттар.
Мұрағаттау: ескі партияларды cold storage-ке ауыстыру (SLA қалпына келтіру құжатталады).
Сэмплирлеу: тек зерттеу міндеттері үшін, реттеуші/қаржы үшін емес.
13) ML үшін тарихи фичтер
Feature registry: әрбір парақта формула, owner, SLO, 'model _ version' бар.
Online/offline үйлесімділігі: бір кодтық трансформация базасы, өтімділік тестілері.
Белгілердің дрейфі: кезеңдер бойынша PSI/KS, тарихи бөлулерді сақтау.
14) Сұрау салу үлгілері
As-of (күніне): есептердің қайталануы.
Cohort-талдау: тіркеу/бірінші депозиттер когорты, rolling терезе.
Slowly changing facts: корректные join’ы с SCD II (`event_time BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31')`).
sql
SELECT b. bet_id, u. rg_status
FROM silver. fact_bets b
JOIN dim. users_scd u
ON u. user_pseudo_id = b. user_pseudo_id
AND b. event_time >= u. valid_from
AND (u. valid_to IS NULL OR b. event_time < u. valid_to);
15) Процестер және RACI
R (Responsible): Data Engineering (модельдер/SCD/backfill), Data Platform (ACID/мұрағат), Finance/Compliance (салыстыру/сақтау талаптары).
A (Accountable): Head of Data/CDO.
C (Consulted): Legal/DPO (DSAR/RTBF/Legal Hold), SRE (құны/SLA), Сәулет.
I (Informed): BI/Өнім/Маркетинг/Операциялар.
16) Енгізу жол картасы
MVP (3-5 апта):1. time-travel (Delta/Iceberg/Hudi) және базалық партиялануы бар ACID-кестелер.
2. Негізгі өлшеулер үшін SCD II (users/games/providers).
3. Сыни агрегаттардың күнделікті snapshots (GGR Daily).
4. DQ-ретінде-код (uniqueness/in_set/temporal) + lineage-баған.
2-фаза (5-10 апта):- Bitemporal фактілер, as-of API/SQL-үлгілер, runbooks backfill/reprocessing.
- FX/күнтізбе/DST-байыту, OLTP DWH/провайдерлер салыстыру.
- Есеп пакеттеріне арналған cold storage, WORM мұрағаттау, Legal Hold.
- Толық автоматтандыру «replay & what-if», регрессия өлшемдері мен алерттерін салыстыру.
- Сақтау құны бойынша ML, chargeback тарихи фичтер және дрейф-бақылау.
- «as-of» өлшемдері мен қайталанатын есептердің құжаттамасы.
17) Азық-түлік алдындағы чек-парағы
- Кестелер time-travel; VACUUM/RETENTION саясаты келісілді.
- SCD II критикалық өлшемдер үшін іске асырылған; join's сынақтан өтті.
- D/M-дегі негізгі агрегаттардың суреттері қол жетімді және жарқылдармен тексерілген.
- DQ-ережелер белсенді; lineage логиканың кіріс/шығыс нұсқаларын көрсетеді.
- DSAR/RTBF/Legal Hold тарихи қабаттарда сыналған.
- cold storage архивтеу және қалпына келтіру құжатталған және тексерілген.
- Бақылаудағы сақтау құны (cost/GB, cold үлесі, SLA қалпына келтіру).
18) Жиі қателіктер және олардан қашу
Нақты уақыт үлгісі жоқ: event/processing/validity қосыңыз.
FX «артқы күнмен»: әрқашан оқиға сәтіндегі бағамды сақтаңыз 'fx _ source'.
SCD дұрыс емес join's: 'is _ current' емес, валидация аралығын пайдаланыңыз.
Өзгермелі Gold-витриналар: есеп беру шығыстары өзгермейтін (немесе нұсқалау) болуы тиіс.
lineage/DQ жоқ: дәлелдеу және бақылау нүктелері жоқ - оларды бірінші күннен бастап енгізіңіз.
Басқарылмайтын құн: ыстық партияларды өшіріңіз, вакуумдаңыз, cold-ке аударыңыз.
19) Глоссарий
As-of Query - деректерді сұрау «Т сәтінде олар қалай көрінді».
Bitemporal - event және processing уақытын бір уақытта бекіту.
Snapshot - кезеңнің соңындағы күйді/агрегаттарды материалданған түсіру.
Time-travel - кестелердің тарихи нұсқаларын оқу.
WORM - өзгермейтін сақтау (Write Once Read Many).
20) Қорытынды
Тарихи деректермен жұмыс - бұл жай ғана «ұзақ сақтау» емес, уақыт тәртібі: нақты event/processing/bitemporal, SCD және snapshots модельдері, reproducible as-of сұрау салулар, қатаң салыстыру және комплаенс-бақылау, бақылау және үнемді сақтау архитектурасы. Осы нұсқаулықты басшылыққа ала отырып, сіз аудитке және бизнес-логиканың өзгерістеріне төзімді есеп беру, талдау және ML үшін сенімді тарихи іргетас аласыз.