使用歷史數據
1)任命和原則
目的:保存和處理過去的狀態,使報告、模型和調查能夠復制、準確和兼容。
原則:- 設計時間獎勵:顯式模式和查詢中的時間模型。
- 可重復性:相同的D日期報告始終產生相同的結果。
- Auditability:可證明的起源(線性),不可變層,WORM在需要的地方。
- Cost-aware:存檔圖層、壓縮、冷庫和易於理解的SLA。
- Privacy-by-設計:在回顧性操作和法律查詢中管理PII。
2)時間模型
事件時間:實際事件的時間(投註、存款)。
處理時間:系統何時處理記錄(可能不同)。
Bitemporal:用於追溯編輯的存儲和處理時間。
Validity間隔:「valid_from」,「valid_to」,「is_current」。
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)存儲層和格式
湖屋:青銅(raw append-only)→銀(clean/SCD/正常化)→黃金(店面)。
ACID-форматы: Delta/Iceberg/Hudi (MERGE/Upsert, time-travel, snapshots).
Tiered storage: hot/warm/cold+WORM用於調節工件。
參與:「event_date」,「market」,「tenant」;按頻繁謂詞(user/game/provider) 聚類/Z順序。
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事實:記錄事件時間和處理時間,以區分後期更正和回顧性計算。
Exactly once story: 「event_id」+等效的MERGE。
6)時間旅行和可重復性
時間旅行:閱讀「T時」表格以進行調試、事件和交換。
邏輯轉換:變換工件(SQL/DBT版本,容器)和輸出表中的「logic_version」標簽。
Frozen outputs:黃金報告文物被捕獲並且不被重寫,hash和出口日誌可用。
sql
SELECT
FROM silver. fact_bets VERSION AS OF 1678901234567
WHERE event_date = DATE '2025-10-31';
7) Backfill и Reprocessing
Backfill:初級/裝載歷史範圍。
重新執行:修復錯誤或更改業務規則後重新計票。
- 相等性(MERGE/upsert),範圍,配額,「暗運行」(dry-run)與度量比較。
- 我們將結果標記為:「recalc_reason」,「logic_version」,「reprocessed_at」。
1.Freeze當前的Gold;2)DLQ/DQ驗證;3)Silver運行;4)比較度量;5)重新組裝Gold;6)出版物和簽名。
8)精度檢查(重新計算)
校驗和:與OLTP、PSP/提供商進行周轉/數量核對。
兩環驗證:樣本中的獨立管道(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,合規性和法律保留
PII最小化:別名,單獨的安全映射。
DSAR/RTBF:可計算的投影和歷史層的選擇性編輯;合法保管義務的例外情況已經記錄在案。
Legal Hold:在範圍/對象中刪除「凍結」標誌,用於報告工件的WORM。
審計:不變的出入和出口邏輯。
11)歷史的DQ和lineage
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()"
線性:捕獲輸入/轉換/輸出版本;依賴圖對於反義是必需的。
12)生產力和成本
參與:按日期/市場/特南特分列;如果經常使用過濾器,則通過「user_pseudo_id」/「game_id」激進聚類。
格式:Parquet+統計/壓縮;常規VACUUM/OPTIMIZE。
實現:用於「昂貴」歷史匯總的precompute;季度/年度報告的快照。
歸檔:將舊批次轉換為冷存儲(記錄了SLA的恢復)。
采集:僅用於研究任務,不用於監管/財務。
13)ML的歷史fichi
功能註冊表:每個幻燈片都有公式,所有者,SLO, 「model_version」。
在線/離線一致性:一個轉換代碼庫,可復制性測試。
特征漂移:按時期劃分的PSI/KS,歷史分布的存儲。
14)查詢模式
As of(按日期):報告的可復制性。
Cohort分析:註冊/首次存款隊列,滾動窗口。
Slowly changing facts: корректные join’ы с SCD II (`event_time BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31')`).
帶有SCD II的join'a示例: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),數據平臺(ACID/歸檔),財務/合規性(對賬/存儲要求)。
A (Accountable): Head of Data/CDO.
C(咨詢):法律/DPO(DSAR/RTBF/Legal Hold),SRE(成本/SLA),體系結構。
I (Informed): BI/產品/營銷/運營。
16)實施路線圖
MVP(3-5周):1.時間旅行的ACID表(Delta/Iceberg/Hudi)和基本分期付款。
2.用於關鍵測量的SCD II(用戶/遊戲/提供者)。
3.關鍵單元的每日快照(GGR Daily)。
4.DQ碼為(uniqueness/in_set/temporal)+線圖。
第二階段(5-10周):- Bitemporal事實,即API/SQL模板,runbooks backfill/reprocessing。
- FX/日歷/DST豐富,OLTP↔DWH/provaydery對賬。
- 冷存儲,報告包的WORM歸檔,法律保留。
- 完全自動化「replay&what-if」,比較指標和回歸的變量。
- 歷史的fici和ML漂移控制,按存儲成本排序。
- 標記和可重現報告的「原樣」文檔。
17)售前支票清單
- 表支持時間旅行;VACUUM/RETENTION策略是一致的。
- SCD II用於關鍵測量;join's測試。
- D/M上的關鍵單元快照可通過對賬進行驗證。
- DQ規則是活躍的;lineage顯示邏輯的輸入/輸出和版本。
- DSAR/RTBF/Legal Hold在歷史層上進行了測試。
- 已記錄和驗證冷庫存檔和恢復。
- 控制存儲成本(成本/GB, cold份額,恢復SLA)。
18)經常出錯以及如何避免出錯
沒有顯式時間模型:添加事件/處理/validity。
「追溯」FX:始終是事件發生時的路線,存儲「fx_source」。
使用SCD的不規則加入:使用有效性間隔而不是「is_current」。
變異金色店面:報告輸出必須不可變(或轉化)。
沒有lineage/DQ:沒有可證明性和檢查點-從第一天開始輸入。
非管理成本:禁用熱批次、真空、轉換為冷。
19)詞匯表
As of Query是對「T時刻的樣子」的數據查詢。
Bitemporal-同時提交事件和處理時間。
Snapshot是期末狀態/聚合的實例化快照。
時間旅行-閱讀表格的歷史版本。
WORM是不可更改的存儲(Write Once Read Many)。
20)結果
處理歷史數據不僅僅是「長期存儲」,而是時間學科:顯式事件/處理/bitemporal,SCD和snapshots模型,可重復查詢性,嚴格的對賬和合規控制,可觀察性和經濟高效的存儲體系結構。遵循此指南,您將獲得一個強大的歷史基礎,用於報告,分析和ML,可對業務邏輯進行審核和更改。