Skip to content

Commit

Permalink
Merge pull request #16 from mfortini/patch-1
Browse files Browse the repository at this point in the history
Esempio caricamento DB completo
  • Loading branch information
aborruso authored Feb 15, 2024
2 parents 9a66420 + d1536fb commit 86156b8
Showing 1 changed file with 47 additions and 1 deletion.
48 changes: 47 additions & 1 deletion posts/csv-ventitre-gigabyte-senza-affanno/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -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 `|`
Expand Down Expand Up @@ -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.<br>
Expand Down

0 comments on commit 86156b8

Please sign in to comment.