diff --git a/posts/csv-ventitre-gigabyte-senza-affanno/index.qmd b/posts/csv-ventitre-gigabyte-senza-affanno/index.qmd index e0145aa..f1e181e 100644 --- a/posts/csv-ventitre-gigabyte-senza-affanno/index.qmd +++ b/posts/csv-ventitre-gigabyte-senza-affanno/index.qmd @@ -64,7 +64,7 @@ Si può usare l'*utilty* `unzip` e lanciare il comando `unzip -p nomefile.zip`. unzip -p "OpenData Complessivo.zip" | head ``` -E subuito si vedrà qualcosa come in @fig-head, che ci restituisce già elementi interessanti: +E subito si vedrà qualcosa come in @fig-head, che ci restituisce già elementi interessanti: - i nomi dei campi; - il separatore è il `|` @@ -135,6 +135,52 @@ Alcune note su questo comando (messo su più righe, per migliorare la leggibilit Tutto circa sempre in un minuto e mezzo, con un file di *output* che pesa circa 33 MB, contro i 530 MB del file `CSV`. +## Importazione dell'intero file + +Il file CSV completo ha, alla data di oggi (15 Febbraio 2024) un problema a 2 righe (su 17.065.848), che hanno un numero errato di colonne (91 anziché 90). +Per poterlo importare occorre filtrare solo le linee che hanno un numero di colonne corretto. + +È possibile importare il file in un DB in formato DuckDB con i seguenti comandi (occorre avere il file CSV su disco per limitare l'occupazione di RAM): + +```bash +unzip "OpenData Complessivo.zip" +awk -F\| '{if (NF-1 == 90) { print } }' < TOTALE.csv > TOTALEfix.csv +duckdb OpenCUP2.db -c "CREATE TABLE OpenCUP AS SELECT * FROM read_csv_auto('TOTALEfix.csv',delim='|',parallel=FALSE);" +``` + +Il file DuckDB risultante, a fronte di un CSV di 23.946.237.777 byte, è 4.466.159.616 byte, con una riduzione a circa 1/6, merito del formato binario contro quello ASCII. + +### Prestazioni del formato DuckDB + +Una query di esempio + +``` bash +time duckdb OpenCUP.db -c "SELECT ANNO_DECISIONE, COUNT(*) FROM OpenCUP GROUP BY ANNO_DECISIONE" > /dev/null + +real 0m0,039s +user 0m0,156s +sys 0m0,063s +``` + +### Conversione nel formato Parquet + +Con il comando + +```bash +duckdb OpenCUP.db -c "COPY (SELECT * FROM OpenCUP) TO 'OpenCUP.parquet' (FORMAT 'PARQUET', CODEC 'ZSTD'); +``` +si ottiene un file Parquet di 2.299.910.076 byte, con una riduzione di circa 1/2 rispetto al formato nativo DuckDB. + +Le prestazioni del formato Parquet sono notevoli + +``` bash +time duckdb -s 'SELECT ANNO_DECISIONE, COUNT (*) FROM read_parquet("OpenCUP.parquet") GROUP BY ANNO_DECISIONE;' > /dev/null + +real 0m0,074s +user 0m0,372s +sys 0m0,043s +``` + ## Note finali Questa descritta è **soltanto** una modalità per fare soprattuto una **prima** **esplorazione** e **analisi** di questo nuovo e importante aggiornamento dei dati di OpenCUP.