Processi ETL/ELT
1) Assegnazione e contesto
Le linee di montaggio ETL/ELT consentono il download prevedibile, la trasformazione e la pubblicazione dei dati per il report (GGR/NGR, regolatori), gli analisti/ML e i pannelli operativi.
ETL: trasformabile prima di essere caricato in DWH/Lakehouse (meno frequentemente in stag moderni).
ELT: prima carichiamo in Lakehouse (Bronze/Silver), poi trasformiamo SQL/motori (raccomandato).
2) Architettura di riferimento
1. Engest/Edge: HTTP/gRPC/Batch, CDC OLTP, provider S3/FTP di carico.
2. Bronze (raw, append-only) - payload invariabili, partenze per data/mercato/tenante.
3. Silver (clean/conform) - Normalizzazione, deadup, guide, SCD, FX/timsons.
4. Gold (serve): vetrine denormalizzate sotto BI/regolatore/modello.
5. Orchestra: Airflow/Dagster/Preferect (DAG, SLA, retrai, spostamenti).
6. DQ/Contracts: Schema Registry + DQ-как-код, consumer-driven tests.
7. Osservabilità: metriche di pipline, lineage, logi, cost-dashboard.
3) Selezione ETL vs ELT
Pratica: nel iGaming ELT + CDC: carichiamo velocemente, poi standardizziamo e contiamo.
4) Incorporazioni e CDC
Approcci al delta:- CDC (Debezium/Logg Replication) - Modifiche a OLTP → Bronze → MERGE in Silver.
- Watermark in base al tempo: 'updated _ at> max _ loaded _ ts'.
- Hash-diff: confronto «md5 (row)» per il dettaglio delle modifiche.
- Upsert/MERGE: Idampotenza dei download.
sql
MERGE INTO silver. payments s
USING stage. payments_delta d
ON s. transaction_id = d. transaction_id
WHEN MATCHED THEN UPDATE SET
WHEN NOT MATCHED THEN INSERT;
5) Contratti e schemi
Schema-first: JSON/Avro/Protobuf in Registry; 'schema _ version'negli eventi/file.
Evoluzione: back-compatibile (aggiunte nullabili); breaking - '/v2 '+ doppia voce.
I campi obbligatori sono «event _ time (UTC)», «event _ id», «trace _ id», «user _ pseudo _ id», «market».
6) DQ-come-codice (set minimo)
yaml table: silver. payments owner: data-payments slo:
freshness_minutes: 15 completeness_percent: 99. 5 rules:
- name: unique_tx # uniqueness of transactions type: unique columns: [transaction_id]
severity: critical
- name: currency_whitelist type: in_set column: currency set: [EUR,USD,GBP,TRY,BRL]
severity: major
- name: amount_positive type: range column: amount_base min: 0. 01 severity: critical
- name: fk_user type: foreign_key column: user_pseudo_id ref_table: dim. users_scd severity: critical
7) Orchestrazione: DAG 'e, dipendenze, SLA
Design DAG: da sorgenti a vetrine evidenti dipendenze tra le attività.
Retrai e idampotenza: backoff, ripetizioni «pulite», checkpoint's.
Spostamenti (catchup) - Raggiunge i periodi ignorati con attenzione.
SLA, ad esempio Gold. daily è pronto entro le 6:00 locali; avvisi di violazione.
Parametrizzazione: mercati/tenenti/date tramite vars; un unico modello di job'o.
8) Idampotenza ed exactly-once
Su ingest: è possibile duplicare il → per '(event _ id, source)'.
In elaborazione: upsert/merge; Funzioni di trasformazione «pulite».
In sink: committenti transazionali o idempotent writes; Il controllo della doppia contabilità.
Outbox/Inbox - Pubblicazione transazionale di eventi di dominio da OLTP.
9) Backfill и reprocessing
Backfill: riempimento primario/intervalli storici.
Riprocessing: ricalcolo quando la logica o le correzioni vengono modificate.
Guardrails: limiti di intervalli, quote, finestre di tempo, dry-run con paragoni di metriche.
Contrassegno: «logic _ variante», «reprocessed _ at», «recalc _ reason».
10) Modellazione Silver/Gold
Silver (3NF/BCNF): fatti'fact _ bets/payments/payouts ', misurazioni dim _ users/games/provider/markets (SCD II)', standardizzazione valuta/timsone.
Gold: vetrine denormalizzate sotto BI/regolatore/modello; pacchetti di esportazione invariati (WORM) + firma.
Esempio Gold: GGR Daily
sql
CREATE OR REPLACE VIEW gold. ggr_daily AS
SELECT
DATE(b. event_time) AS event_date,
b. market,
g. provider_id,
SUM(b. stake_base) AS stakes_eur,
SUM(p. amount_base) AS payouts_eur,
SUM(b. stake_base) - SUM(p. amount_base) AS ggr_eur
FROM silver. fact_bets b
LEFT JOIN silver. fact_payouts p
ON p. user_pseudo_id = b. user_pseudo_id
AND p. game_id = b. game_id
AND DATE(p. event_time) = DATE(b. event_time)
JOIN dim. games g ON g. game_id = b. game_id
GROUP BY 1,2,3;
11) Privacy e residenza
Riduzioni PII - Tornizzazione mapping ID reali in un circuito isolato.
RLS/CLS: regole di accesso per ruoli/giurisdizioni, mascheramento.
Residency: cataloghi/chiavi separati per EEA/UK/BR; divieto di join'ov crocifissori senza fondamento.
DSAR/RTBF & Legale Hold: modifiche selettive, archivi WORM per il reporting, controllo dell'esportazione.
12) Osservabilità e SLO
Punti di riferimento SLI/SLO:- Freshness Silver p95-15 min; Gold daily è pronto entro le 6:00. del tempo.
- Completeness ≥ 99. 5%, Validity (schema) 99. 9%.
- Successo di JOB 99. 0%, incidenti MTTR 24-48 ore
Dashboard: Freshness heatmap, vortice di perdita DQ, cost/query & cost/GB, lineage-grafico.
13) Prestazioni e costi
Partitura: data/mercato/tenante; clustering/Z-order per filtri.
Formati: Parquet + ACID (Delta/Iceberg/Hudi), compressione e statistiche.
Compattazione: lotta contro gli small files (OTTIMIZE/VACUUM).
Materializzazione: unità stabili; evitare i giganti on-the-fly join'ov.
Marceback: budget, quote per replay/backfill; pianificazione delle finestre a basso carico.
14) Esempi di attività di tipo DAG (pseudo-codice Airflow)
python with DAG("elt_payments_daily", schedule="@daily", start_date=..., catchup=True) as dag:
extract = BashOperator(task_id="extract_cdc", bash_command="run_cdc_to_bronze. sh {{ ds }}")
load = BashOperator(task_id="load_to_silver", bash_command="sql/run_merge_silver. sql {{ ds }}")
dq = BashOperator(task_id="dq_checks", bash_command="dq/run_checks. sh silver. payments {{ ds }}")
gold = BashOperator(task_id="build_gold_ggr", bash_command="sql/build_gold_ggr. sql {{ ds }}")
export = BashOperator(task_id="export_regulator", bash_command="export/run_worm_pack. sh {{ ds }}")
extract >> load >> dq >> gold >> export
15) Processi e RACI
R (Responsibile) - Data Engineering (DAG 'e, modelli Silver/Gold), Data Platform (Infra, Registry, DQ).
A (Accountable): Head of Data/CDO.
C (Consulted): Compliance/Legal/DPO (PII/residency/Legal Hold), Finance (FX/GGR), Risk (RG/AML), SRE (SLO/стоимость).
I (Informed): BI/Prodotto/Marketing/Operazioni.
16) Road map di implementazione
MVP (3-5 settimane):1. Lakehouse Bronze/Silver (ACID) + CDC/Incrementi per Payments/Gameplay.
2. Codice come DQ (10-15 regole) e dashboard di base Freshness/Completeness.
3. Prima vetrina Gold (GGR Daily) con SLA «fino alle 6:00», esportazione WORM firmata.
4. Orchestra DAG e alert su SLA/DQ.
Fase 2 (5-10 settimane):- Estensione dei domini, SCD II per users/games/provider.
- Strato semantico delle metriche; lineage/impatto-analisi procedure backfill/reprocessing.
- Regionalizzazione (EEA/UK), RLS/CLS, controllo del valore (quote/conformeback).
- Simulatore di replica (what-if), generazione automatica della documentazione delle vetrine/metriche.
- Ottimizzazione cost (clustering, materializzazione, TTL, compressione).
- Esercitazioni DR e time-travel ripristino.
17) Foglio di assegno prima della vendita
- Contratti/schemi in Registry, test di compatibilità verde.
- CDC/incarnazioni e MERGE sono idepotenti; Dedotto su ingest.
- Le regole DQ sono attive (critical → fail + DLQ) e i dashboard SLA sono configurati.
- Le vetrine gold sono documentate, le formule sono metriche in uno strato semantico.
- RBAC/ABAC, crittografia, residenza, DSAR/RTBF/Legale Hold sono stati verificati.
- Compattazione/OTTIMIZE/VACUUM pianificata; limiti di backfill/repliche.
- Runbook e incidenti e reprocessing, controllo delle esportazioni (WORM + hash).
18) Anti-pattern e rischi
Full reload «per sicurezza»: usa CDC/Incolla.
Miscelare dati crudi e report: tenete Bronze/Silver/Gold separatamente.
Nessun DQ o lineage: nessuna prova di riproduzione.
PII nei livelli analitici: isola i muppings, applica CLS/RLS.
«Notturni» monolitiche, frazionate, parallele alle partiture.
Ignora il costo: tieni d'occhio gli small files, materializza le unità, inserisci le quote.
19) Glossario (breve)
ETL/ELT - Recupero/trasformazione/caricamento (prima/dopo il download).
CDC - Acquisizione dei cambiamenti.
SCD - storializzazione delle misurazioni (I/II/III).
WORM - Storage dei pacchetti di report invariato.
Time-travel - Lettura delle versioni storiche delle tabelle.
20) Totale
La moderna ETL/ELT non è una piattaforma di script, ma è una piattaforma gestibile: contratti e DQ, invertini idipotenti/CDC, disciplina dei livelli Bronze/Silver/Gold, osservabilità e SLO, privacy e convenienza. Seguendo questo manuale, si otterranno linee di montaggio riproducibili e audibili che alimentano stabilmente rapporti, prodotti e modelli su scala e senza sorprese.