עבודה עם נתונים היסטוריים
1) מטרה ועקרונות
המטרה: לאחסן ולעבד מדינות בעבר כך שהדיווחים, המודלים והחקירות יהיו מדויקים, מדויקים וצייתנים.
עקרונות:- מודלי זמן בעיצוב מפורשים בתכניות ושאילתות.
- רבייה: אותו דו "ח עבור תאריך D תמיד מייצר את אותה התוצאה.
- שמיעה: שושלת, שכבות בלתי ניתנות לשינוי, תולעים במקום הצורך.
- עלות מודעת: שכבות ארכיון, דחיסה, אחסון קר עם SLA מובן.
- פרטיות לפי עיצוב: ניהול מח "ש לעסקאות רטרוספקטיביות ובקשות משפטיות.
2) מודלים בזמן
זמן האירוע: זמן האירוע בפועל (קצב, הפקדה).
זמן עיבוד כאשר המערכת מעבדת את התקליט (עשוי להיות שונה).
אחסון שני המקרים וזמן עיבוד לעריכה רטרואקטיבית.
מרווחי תוקף: "valid _ from'," valid _ to ", הוא _ הנוכחי.
לפי שאילתות: דגימת מידע ”כפי שהם ידעו בזמן ט”.
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 apend-only) # Silver (נקי/SCD/נורמליזציה) # Gold (תצוגות).
Delta/Iceberg/Hudi (מיזוג/אפסרט, מסע בזמן, תמונות).
אחסון ממוקד: חם/חם/קר + תולעת עבור חפצים רגולטוריים.
מחיצה: ”אירוע _ תאריך”, ”שוק”, ”דייר”; על ידי תחזיות תכופות (משתמש/משחק/ספק).
4) היסטוריית המדידה (SCD)
כתובה לעריכה לא ביקורתית.
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: לתקן אירוע-זמן ועיבוד-זמן להבחין תיקונים מאוחרים מחישובים רטרוספקטיביים.
בדיוק פעם אחת בהיסטוריה: dedup by "event _ id' + idempotent Merge.
6) מסע בזמן והתרבות
מסע בזמן: לקרוא שולחנות ”בזמן ט” לדיבוג, תקריות, פיוס.
ויסות לוגי: פריטי שינוי צורה (גרסאות SQL/DBT, מכלים) ותוויות ”logic_version” בטבלאות פלט.
יציאות קפואות: פריטים מדווחים על זהב נתפסים ולא נכתבים מחדש, יומן חשיש ויצוא זמינים.
sql
SELECT
FROM silver. fact_bets VERSION AS OF 1678901234567
WHERE event_date = DATE '2025-10-31';
7) מילוי גב עיבוד מחדש
מילוי אחורי: ראשית/טעינה מראש טווח היסטורי.
חישוב חוזר: חישוב מחדש לאחר תיקון באגים או שינוי כללים עסקיים.
- אידמפוטנטיות (MERGE/upsert), טווחים, מכסות, יובש-לרוץ עם השוואה מטרית.
- מסמן את התוצאה: ”recalc _ reason”, ”logic _ version”, ”repossed _ at”.
1. הקפאת הזהב הנוכחי; 2) אימות DLQ/DQ; 3) ריצת כסף; 4) השוואה של מדדים; 5) בנייה מחדש של זהב; 6) פרסום וחתימה.
8) פיוס
CHECTSUMS: פיוס של כרכי מכירות/כמויות עם OLTP, PSP/ספקים.
בדיקת לולאה: צינור עצמאי על מדגם (A/B השוואה).
סובלנות כמו חוסר התאמה בין GGR ל-0. שני אחוזים להיום.
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/Timezones דרך ספריית לוח השנה.
חגים/עונה: שולחן לוח שנה נפרד, בשימוש בדגמים ודוחות.
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: פסאודונימיזציה, מיפוי מוגן נפרד.
DSAR/RTBF: תחזיות חישוביות ועריכה סלקטיבית של שכבות היסטוריות; חריגות אחסון חוקיות מתועדות.
Hold חוקי: דגלים ”להקפיא” מחיקות על רכסים/חפצים, תולעת עבור חפצים שניתן לדווח עליהם.
ביקורת: גישה בלתי ניתנת לשינוי ויומני ייצוא.
11) DQ ושושלת להיסטוריה
DQ-as-code (דוגמה):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()"
שושלת: תיקון גרסאות של קלט/טרנספורמציות/יציאות; גרף התלות נדרש לשיקום.
12) ביצועים ועלות
מחיצה: לפי תאריך/שוק/דייר; קיבוצים אגרסיביים על ידי ”user _ pseudo _ id'/” game _ id', אם אנחנו מסננים לעתים קרובות.
פורמטים: Parquet + סטטיסטיקה/דחיסה; ואקום/אופטימיזציה רגילה.
התממשות: חישוב מראש להצטברות היסטורית ”יקרה”; תמונות לדיווח רבעוני/שנתי.
ארכיון: המרת קבוצות ישנות לאחסון קר (SLAS להחלמה מתועדים).
דגימה: רק למשימות מחקר, לא לרגולציה/מימון.
13) מאפיינים היסטוריים ל ־ ML
תרשים תכונה: לכל תכונה יש נוסחה, בעלים, SLO, 'model _ version'.
עקביות מקוונת/לא מקוונת: קוד שינוי אחד, מבחני חזרה.
סחף אופייני: PSI/KS לפי תקופה, אחסון של הפצות היסטוריות.
14) תבניות שאילתה
כמו של: רבייה של דיווחים.
ניתוח קוהורטה: קוהורטות לרישום/פיקדונות ראשונים, חלונות מתגלגלים.
אט אט משתנות העובדות: countructionallough complete 'viewsCD II (”אירוע _ זמן בין valid_from לפחם (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 (אחראי): הנדסת נתונים (מודלים/SCD/backfill), פלטפורמת נתונים (חומצה/ארכיון), פיננסים/ציות (דרישות פיוס/אחסון).
א '(אחראי): ראש הנתונים/CDO.
C (ייעוץ): Legal/DPO (DSAR/RTBF/Legal Hold), SRE (עלות/SLA), ארכיטקטורה.
אני (מושכל): BI/מוצר/שיווק/מבצעים.
16) מימוש מפת דרכים
MVP (3-5 שבועות):1. שולחנות חומצה עם מסע בזמן (דלתא/קרחון/האדי) וחלוקה בסיסית.
2. SCD II עבור ממדי מפתח (משתמשים/משחקים/ספקים).
3. תמונות יומיות של צבירה ביקורתית (GGR Daily).
4. DQ-as-code (uniqueness/in_set/temporal) + שושלת-גרף.
שלב 2 (5-10 שבועות):- עובדות Bitemporal, כמו תבניות API/SQL, ספרי ריצה לאחור/עיבוד מחדש.
- FX/לוח שנה/DST-העשרה, OLTP↔DWH/provaydery פיוס.
- ארכיון אחסון קר, תולעת לדיווח חבילות, אחיזה משפטית.
- אוטומציה מלאה של ”שידור חוזר ומה-אם”, השוואה של מדדים והתראות רגרסיה.
- מאפיינים היסטוריים ושליטה על אם-אל, גב מטען בעלויות אחסון.
- תיעוד ”כמו של” מדדים ודוחות רבייה.
17) רשימת בדיקות לפני המכירה
[ שולחנות ] תומכים במסע בזמן; מדיניות ואקום/שימור עקבית.
[ ] SCD II מיושם למדידות קריטיות; המצטרפים נבדקו.
[ ] תמונות של יחידות מפתח על D/M זמינות ונבדקות עם נצנצים.
[ ] כללי DQ פעילים; שושלת מציגה קלט/יציאות וגרסאות היגיון.
[ ] DSAR/RTBF/Legal Hold נבחנה על שכבות היסטוריות.
[ ] הארכיון הקר וההתאוששות מתועדים ומאומתים.
[ עלות ]/GB, נתח קר, התאוששות SLA
18) טעויות תכופות וכיצד להימנע מהן
אין מודל זמן מפורש: הוספת אירוע/עיבוד/תוקף.
FX ”רטרואקטיבית”: תמיד המסלול בזמן האירוע, לאחסן ”fx _ source”.
הצטרפות לא תקפה עם SCD: השתמש במרווח תוקף, לא 'is _ הנוכחי'.
תצוגות זהב מוטציות: יציאות דוחות חייבות להיות ניתנות להנצחה (או מבוססות).
אין שושלות/DQ: אין probability ומחסומים - להיכנס אליהם מהיום הראשון.
עלות בלתי ניתנת לשליטה: לכבות מסיבות חמות, ואקום, להמיר לקור.
19) גלוסרי
כפי-של שאילתא - בקשת נתונים ”כפי שהם הסתכלו על זמנו של ט”
סיבוכיות סימולטנית של זמן אירוע ועיבוד.
Snapshot - תמונה ממומשת של סטטוס/אגרגטים בסוף התקופה.
מסע בזמן - קריאת גרסאות היסטוריות של שולחנות.
תולעת - כתוב פעם אחת לקרוא רבים.
20) השורה התחתונה
עבודה עם נתונים היסטוריים היא לא רק ”אחסון ארוך”, אלא גם משמעת הזמן: אירוע מפורש/עיבוד/bitemporal, מודלים של SCD ו-Snapshots, רפרודוקטיביות של בקשות, פיוס קפדני ובקרה, תצפית וארכיטקטורת אחסון יעילה. אם תעקוב אחר מדריך זה, יהיה לך בסיס היסטורי מוצק לדיווח, אנליטיקה ו-ML