2010-10-20 19 views
20

Ho bisogno di esportare una grande tabella in file CSV e comprimerla.Esportare in CSV e comprimere con GZIP in postgres

posso esportare utilizzando il comando COPY da Postgres come -

COPY foo_table to '/tmp/foo_table.csv' delimiters',' CSV HEADER;

e quindi può comprimerlo con gzip come -

gzip -c foo_table.csv > foo.gz

Il problema di questo approccio è, io è necessario creare questo file csv intermedio, che è di per sé enorme, prima di ottenere il file finale compresso.

Esiste un modo per esportare la tabella in csv e comprimere il file in un unico passaggio?

saluti, Sujit

+0

Se non deve necessariamente essere CSV, è possibile utilizzare pg_dump, come in: 'pg_dump -Z 5' –

risposta

37

Il trucco è quello di rendere COPY inviare il suo output sullo standard output, quindi inviare l'output attraverso gzip:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \ 
    | gzip > foo_table.csv.gz 
+0

perfetto, ha funzionato! – Sujit

+2

si può usare pigz (gzip multithread) invece di gzip per una compressione più veloce. Di solito gzip è il bottlneck. – sivann

5

Espansione di un po '@ risposta di Joey, di seguito aggiunge il supporto per un altro paio di funzioni disponibili in the manual.

psql -c "COPY \"Foo_table\" (column1, column2) TO stdout DELIMITER ',' CSV HEADER" \ 
    | gzip > foo_table.csv.gz 

Se si dispone di lettere maiuscole nel nome della tabella (guai essere su di te), è necessario il \" prima e dopo il nome della tabella.

La seconda cosa che ho aggiunto è l'elenco delle colonne.

notare anche dalla documentazione:

Questa operazione non è efficiente come il comando SQL COPY perché tutti i dati devono passare attraverso la connessione client/server. Per grandi quantità di dati potrebbe essere preferibile il comando SQL.

Problemi correlati