Medallion Architecture: Guida Pratica ai 6 KPI di Data Quality (con Codice SQL e PySpark)

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
MEDALLION ARCHITECTURE I 6 KPI CHE TI SALVANO LA VITA

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.

Pubblicità

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]
Forse potrebbe interessarti anche:  Guida Pratica: 6 Esercizi Python con Pandas e SQLite per l'Analisi Dati

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)
  • Idempotenza (riprocessare lo stesso file non duplica i dati)
  • Partizione per data
  • Colonne tecniche obbligatorie (es. ingest_timestamp, source_file)
Silver (Clean)
  • Test automatici (es. dbt) obbligatori
  • Deduplica deterministica (es. con [math]\text{QUALIFY}[/math])
  • Gestione dei record scartati in una error_table
Gold (Curated)
  • Metriche versionate (es. Revenue_v2025_01)
  • Documentazione semantica chiara
  • SLA di freschezza monitorato

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.
Forse potrebbe interessarti anche:  Logit nel Deep Learning: il ruolo dei punteggi lineari prima della Softmax

Pubblicità