KPI e Checklist per la Medallion Architecture
Edizione 2025 – La versione che ti salva la carriera (e il sonno)
La verità che nessuno ti dice all’università
C’è un momento preciso in cui capisci se la tua pipeline di dati è solida o se è solo un castello di carte. Non è quando scrivi il codice, e nemmeno quando vedi le tabelle popolarsi. È quel momento di silenzio imbarazzante durante una riunione, quando qualcuno alza la mano e chiede: “Scusa, ma perché il fatturato di ieri su questa dashboard è diverso da quello che vedo sul CRM?”.
I dati giusti non ti fanno prendere una pacca sulla spalla. I dati sbagliati ti fanno svegliare alle 3 di notte con 47 messaggi WhatsApp da direttore finance, CEO e avvocato.
I KPI non sono per fare bella figura col prof. I KPI sono il tuo paracadute quando la sorgente decide di mandarti ordini con l’importo negativo, duplicati o clienti che nascono nel 1890.
I 6 KPI che devi tatuarti nel cervello
| KPI | Domanda che risponde in italiano | Esempio da bar (su 100 ordini) | Valore da raggiungere per non essere licenziato |
|---|---|---|---|
| Completezza | “Quanti ordini sono davvero utilizzabili?” | 96 hanno importo e cliente validi [math]\to 96\%[/math] | Bronze [math]\ge 80\%[/math] Silver [math]\ge 95\%[/math] Gold [math]\ge 99\%[/math] |
| Unicità | “Quanti ordini sono stati caricati due volte?” | L’ordine 12345 è arrivato 3 volte [math]\to 2\%[/math] di duplicati | Silver [math]\le 1\%[/math] Gold [math]= 0\%[/math] |
| Integrità | “Ogni ordine ha un cliente che esiste davvero?” | 2 ordini puntano a un [math]\text{customer\_id}[/math] inesistente [math]\to 98\%[/math] | Silver [math]\ge 97\%[/math] Gold [math]\ge 99,8\%[/math] |
| Freschezza | “Quanto tempo passa da quando succede a quando lo vede il capo?” | Ordine fatto alle 14:03 [math]\to[/math] dashboard aggiornata alle 14:12 [math]\to 9 \text{ min}[/math] | [math]< 15 \text{ min} \text{ (real-time)}[/math] o [math]< 4 \text{ ore} \text{ (batch)}[/math] |
| Consistenza | “Marketing e Finance vedono lo stesso fatturato?” | (vedi l’aneddoto qui sotto) | [math]100\%[/math] – non si discute |
| Adoption | “Qualcuno usa davvero questa roba che ho fatto?” | 5 team diversi + 18 dashboard attive [math]\to \text{alta}[/math] | Minimo 3 team reali + [math]30 \text{ utenti/mese}[/math] |
Aneddoto vero che racconto a tutti i miei studenti
Grande catena retail italiana, 2023.
Il Marketing festeggia: “+18% di fatturato questo mese!”
Il Finance entra in riunione con la faccia da funerale: “-3%, siamo quasi in perdita.”
Seguono tre settimane di guerra interna. Alla fine scoprono che:
- Il Marketing calcolava il fatturato includendo l’IVA.
- Il Finance lo calcolava escludendo l’IVA.
Tecnicamente, i dati erano corretti in entrambi i casi.
Il problema? Mancava una definizione univoca e condivisa di “Fatturato” nel livello Gold.
Morale: la consistenza non è un optional da secchioni, è ciò che ti evita di diventare il capro espiatorio aziendale quando i numeri non tornano.
Checklist anti-licenziamento (attaccala sopra il monitor)
| Livello | Se non hai queste cose [math]\to[/math] sei nei guai seri |
|---|---|
| Bronze (Raw) |
|
| Silver (Clean) |
|
| Gold (Curated) |
|
Codice che funziona davvero nel 2025 (testato su Databricks, Snowflake, BigQuery)
Non usare script giocattolo. Questi sono ottimizzati per non far esplodere il tuo cluster quando hai milioni di righe.
SQL – Lo standard universale (SparkSQL, Snowflake, BigQuery)
-- Esempio di controllo rapido su una tabella Silver.
-- Nota: l'uso di CASE WHEN assicura compatibilità cross-platform.
SELECT
-- Completezza: conta solo se i campi chiave sono validi e hanno senso (amount > 0)
100.0 * SUM(CASE WHEN order_id IS NOT NULL AND amount > 0 AND customer_id IS NOT NULL THEN 1 ELSE 0 END) / COUNT(*) AS completezza_pct,
-- Unicità: conta gli ID distinti rispetto al totale
100.0 * COUNT(DISTINCT order_id) / COUNT(*) AS unicita_pct,
-- Freschezza media (in minuti): calcola la differenza tra ora e l'evento
AVG(DATEDIFF(minute, order_timestamp, current_timestamp())) AS freschezza_media_minuti
FROM silver.orders;
-- Per l'Integrità (Referenziale), un controllo separato è spesso più performante su big data:
-- SELECT COUNT(*) as orfani FROM silver.orders o
-- LEFT ANTI JOIN silver.customers c ON o.customer_id = c.customer_id;
PySpark – La via professionale (NON usare toPandas!)
Guai a te se usi toPandas() su una tabella intera durante un colloquio: dimostri di non saper gestire i Big Data perché cerchi di scaricare tutto nella RAM del driver. Usa le funzioni native di Spark che distribuiscono il calcolo:
from pyspark.sql import functions as F
# Carichiamo la tabella come DataFrame distribuito
df = spark.table("silver.orders")
# Calcoliamo i KPI in un'unica passata ottimizzata
kpi_df = df.agg(
# Completezza: usa F.when per la logica condizionale
(F.sum(F.when(
F.col("order_id").isNotNull() &
(F.col("amount") > 0) &
F.col("customer_id").isNotNull(), 1).otherwise(0)) / F.count("*") * 100).alias("completezza_pct"),
# Unicità
(F.countDistinct("order_id") / F.count("*") * 100).alias("unicita_pct"),
# Freschezza media in minuti (differenza in giorni * 1440 minuti/giorno)
F.avg(F.datediff(F.current_timestamp(), F.col("order_timestamp")) * 1440).alias("freschezza_media_min")
)
kpi_df.show()
La frase da dire alla tesi o al colloquio (Funziona al 100%)
Quando ti chiedono “Come garantisci la qualità?”, non balbettare. Guardali negli occhi e snocciola questi numeri:
«Ho implementato controlli automatici che hanno portato la completezza dal [math]79\%[/math] del dato grezzo (Bronze) al [math]99,2\%[/math] nel livello Gold.
Abbiamo eliminato il 100% dei duplicati in Silver grazie a una deduplica deterministica e garantiamo un’integrità referenziale del [math]99,9\%[/math] verso l’anagrafica clienti.
La pipeline ha una freschezza media di 8 minuti [math]\text{end-to-end}[/math], e oggi il mio layer Gold è l’unica fonte di verità consumata da 6 team diversi, inclusi Finance e Marketing che finalmente non litigano più sul fatturato.»
Risultato:
- Il prof ti dà [math]30 \text{ e lode}[/math] e ti chiede se vuoi fare il dottorato.
- Il recruiter ti manda l’offerta di lavoro prima ancora che tu finisca la frase.
Articoli di approfondimento
👉 Databricks: laboratorio intelligente per dati, AI e automazione
👉 Guida pratica 2025: crea il tuo primo progetto Databricks da zero
👉 Data Lakehouse: cos’è, come funziona e perché unisce il meglio di Data Lake e Warehouse
👉 Guida pratica al Data Lakehouse: progetto IoT completo con Python, Spark e Delta Lake
👉 Guida completa 2025: installazione di PySpark e Java per elaborazione Big Data in locale
👉 File Parquet: guida pratica per usarli con Python, esempi e vantaggi sul CSV
⚡ Medallion Architecture 2025: guida completa ai livelli Bronze, Silver e Gold





