Pipeline dati

Caricare

I dati puliti entrano in un database MySQL su Aiven, condiviso da tutto il team. Con Python, nell'ordine giusto e a blocchi.

Vista dall'interno di un rimorchio: un carrello elevatore avanza dalla banchina con un bancale di merce.
Si carica un bancale alla volta, non una scatola alla volta. Con i dati vale lo stesso. Foto di Elevate su Unsplash.

In breve

  • Un database per tuttiMySQL in cloud su Aiven: ogni membro del team lavora sulle stesse tabelle, senza copie locali da sincronizzare.
  • Prima i padri, poi i figliLe tabelle indipendenti entrano per prime. Le chiavi esterne rifiutano un record che punta a qualcosa che non esiste ancora.
  • A blocchi, non riga per rigaexecutemany() invia 100 record per volta, 5.000 per i rifornimenti. Meno viaggi verso il cloud.

L'ordine di caricamento

Da sinistra a destra, come in inserimento_dati.py. Sotto ogni tabella, le tabelle da cui dipende.

  1. Tabelle indipendenti

    Nessuna chiave esterna

    • drivers
    • customers
    • routes
    • trucks
    • trailers
    • facilities
  2. Il carico

    Serve sapere cliente e tratta

    • loadscustomers, routes
  3. Il viaggio

    Il carico, chi guida e con cosa

    • tripsloads, drivers, trucks, trailers
  4. Eventi e metriche

    Si agganciano a viaggi e mezzi

    • maintenance_recordstrucks
    • truck_utilization_metricstrucks
    • fuel_purchasestrips, trucks, drivers
    • delivery_eventsloads, trips, facilities
    • safety_incidentstrips, trucks, drivers
    • driver_monthly_metricsdrivers

Riga per riga o a blocchi

Ogni invio a un database in cloud è un andata e ritorno in rete. Con 1.000 record la differenza si vede subito.

Riga per rigaUna INSERT per record
1.000invii
A blocchi da 100executemany() per blocco
10invii
Il principio
batch_size = 100

for i in range(0, len(data), batch_size):
    batch = data[i:i + batch_size]
    cursor.executemany(query, batch)

conn.commit()

Il ciclo divide i record in gruppi e ne invia uno per volta. Il commit() finale conferma tutto nel database.

Perché due misure di blocco.

Per quasi tutte le tabelle bastano 100 record per invio. fuel_purchases contiene molte più righe: con blocchi da 5.000 il caricamento resta rapido.

Il risultato è un processo automatico, ordinato e ripetibile, che regge anche quando i dati crescono.