CSV vs Parquet: quando conviene davvero convertire
Parquet non è automaticamente meglio del CSV. Ecco come decidere e come misurare la differenza sui tuoi dati.
Di Vincenzo Manto · Pubblicato il · 6 min di lettura
Due formati, due obiettivi di progetto
Si tende a trattare CSV e Parquet come la versione vecchia e quella nuova della stessa cosa. Sono nati per compiti diversi, e la maggior parte delle conversioni sbagliate nasce dal dimenticarlo.
Il CSV è testo semplice con un record per riga e valori separati da un delimitatore. L'RFC 4180, pubblicata nel 2005, descrive le convenzioni più diffuse ed è un documento informativo, non uno standard rigido. Questa elasticità è il motivo per cui il CSV è ovunque: qualsiasi programma può leggerlo e scriverlo, e una persona può aprirlo in un editor di testo. È anche all'origine dei problemi: non c'è uno schema, non ci sono tipi né compressione, e nulla garantisce delimitatore, virgolette o codifica.
Apache Parquet è un formato binario a colonne nato all'inizio degli anni 2010 per i carichi di lavoro analitici. Invece di memorizzare riga dopo riga, conserva insieme i valori di ciascuna colonna, raggruppati in row group. Il file contiene il proprio schema con i tipi di dato, comprime ogni colonna separatamente e mantiene in un footer statistiche come i valori minimo e massimo.
Perché le colonne si comprimono e si leggono meglio
I valori di una colonna hanno lo stesso tipo e tendono ad assomigliarsi: un codice paese ripetuto milioni di volte, timestamp che crescono con regolarità, un campo di stato con cinque valori possibili. Parquet sfrutta questa regolarità con codifiche come la dictionary encoding e la run-length encoding, e poi applica sopra un codec generico come Snappy, Gzip o Zstandard.
Lo stesso schema aiuta in lettura. Un motore che ha bisogno di due colonne su quaranta può leggere solo quelle due, e può saltare interi row group i cui valori minimo e massimo escludono una corrispondenza. Un lettore CSV non ha questa possibilità: per trovare il valore di una colonna deve scorrere e analizzare ogni riga.
Cosa si guadagna convertendo
- File più piccoli quando i dati sono ripetitivi. Colonne categoriche, date e identificatori a bassa cardinalità si riducono molto. Colonne di identificatori casuali o di numeri in virgola mobile ad alta precisione si riducono molto meno.
- Query analitiche più veloci, perché i motori leggono solo le colonne e i row group che servono.
- Tipi preservati. Interi, decimali e timestamp restano ciò che sono, quindi un CAP scritto come 00123 non è più in balìa di un foglio di calcolo che lo trasforma in 123.
- Uno schema che viaggia con i dati, così la persona successiva non deve indovinare cosa significhi ogni colonna.
Cosa si perde
- La leggibilità diretta. Non puoi aprire un file Parquet in un editor di testo né con un doppio clic in un foglio di calcolo.
- Le aggiunte economiche. I file Parquet sono scritti per row group e non sono pensati per essere modificati sul posto, quindi aggiungere una riga significa scrivere un nuovo file.
- La semplicità per i file piccoli. Footer e metadati hanno un costo fisso, che può rendere un piccolo file Parquet più grande del CSV di partenza.
- La compatibilità. Alcuni strumenti aziendali e sistemi più vecchi accettano solo CSV.
Una guida alla decisione
Converti in Parquet quando il file è grande, quando lo leggi ripetutamente e di solito ti servono solo alcune colonne, quando più pipeline lo condividono e hanno bisogno di tipi coerenti, o quando resterà a lungo in uno storage a oggetti. Mantieni il CSV quando il file è piccolo, quando le persone lo modificano a mano, quando lo invii a qualcuno che deve solo aprirlo, quando il sistema di destinazione accetta solo CSV, o quando il lavoro è occasionale.
Come misurarlo sui tuoi dati
I risultati di compressione dipendono interamente dai dati, quindi qualsiasi rapporto universale letto online va preso con sospetto. Una risposta affidabile richiede pochi minuti con il tuo file:
- Profila prima il CSV. Un profiler dei dati mostra tipi di colonna, conteggio dei null e numero di valori distinti, e ti dice quali colonne si comprimeranno bene.
- Converti il file in Parquet con un convertitore da CSV a Parquet.
- Confronta le dimensioni dei due file e annota quali colonne ti aspettavi si riducessero.
- Leggi lo schema del risultato. L'inferenza dei tipi può sbagliare, e identificatori con zeri iniziali, codici numerici lunghi e date in formati misti sono le vittime abituali. Correggi la sorgente o le impostazioni di conversione se una colonna ha il tipo sbagliato.
- Ispeziona i metadati: numero di row group, codec di compressione e statistiche per colonna. Spiegano la dimensione ottenuta.
- Riconverti il file Parquet in CSV e confrontalo con l'originale. Conserva l'originale finché il giro completo non coincide.
Ognuno di questi passaggi si può fare nel browser senza caricare il file, cosa importante se i dati sono riservati. Gli strumenti collegati qui sotto coprono ciascuno di essi.
Errori comuni nella conversione
- Fidarsi ciecamente dell'inferenza dei tipi. Una colonna che sembra numerica nelle prime mille righe può contenere testo più avanti, e il convertitore può fallire oppure ripiegare sulle stringhe.
- Convertire tanti file minuscoli uno alla volta. Parquet dà il meglio con file più grandi, quindi unisci prima le piccole esportazioni CSV e scrivi meno file, più grandi.
- Buttare via la sorgente. Considera il CSV come archivio finché non hai verificato il file Parquet, e annota le impostazioni di conversione usate.
- Ignorare i fusi orari. Un timestamp scritto senza offset in un CSV è ambiguo, e convertirlo obbliga a una scelta. Falla in modo esplicito, invece di lasciarla a un valore predefinito.
Perché non c'è un rapporto di compressione
Non ho citato un dato come "Parquet è dieci volte più piccolo". Per alcuni dataset vale, per altri il guadagno è modesto, e per i file minuscoli il risultato può essere peggiore. Se un formato deve stare al centro della tua pipeline, dedica dieci minuti a provarlo su un campione rappresentativo prima di impegnarti.
Strumenti citati in questo articolo
- Profilatore DatiProfila ogni colonna di un CSV: tipo, valori nulli, univoci e più frequenti.
- Convertitore da CSV a ParquetConverti un file CSV in un file Apache Parquet compatto e tipizzato, nel browser.
- Lettore Schema ParquetEstrai e ispeziona lo schema delle colonne di un file .parquet.
- Lettore Metadati ParquetIspeziona tutti i metadati nel footer di un file Parquet: row group, codec, dimensioni e altro.
- Lettore e Visualizzatore ParquetApri e sfoglia file Apache Parquet come una tabella, direttamente nel browser.
- Convertitore da Parquet a CSVConverti un file Apache Parquet in CSV, con anteprima e download nel browser.