我有一个很大的压缩csv文件(25gb),我想将它导入PostgreSQL 9.5版本。有没有快速的方法将zip或qzip文件导入postgres而不解压缩文件?
答案 0 :(得分:16)
使用命名管道有一个老技巧(适用于Unix,不了解Windows)
mkfifo /tmp/omyfifo
zcat mycsv.csv.z > /tmp/omyfifo &
copy mytable(col1,...) from '/tmp/omyfifo'
rm /tmp/omyfifo
背景中的zcat
将阻塞,直到读者(此处:COPY
命令)将开始阅读,并且它将在EOF结束。 (或者如果读者关闭管道)
您甚至可以启动多个管道+ zcat对,这些管道将由您的sql脚本中的多个COPY
语句选取。
这将在pgadmin中运行,但是fifo(+ zcat进程)应该存在于运行DBMS服务器的机器上。
BTW:使用netcat的类似技巧可用于从远程机器读取文件(当然应该将文件写入网络套接字)答案 1 :(得分:7)
示例如何使用zcat
和pipe
:
-bash-4.2$ psql -p 5555 t -c "copy tp to '/tmp/tp.csv';"
COPY 1
-bash-4.2$ gzip /tmp/tp.csv
-bash-4.2$ zcat /tmp/tp.csv.gz | psql -p 5555 t -c "copy tp from stdin;"
COPY 1
-bash-4.2$ psql -p 5555 t -c "select count(*) from tp"
count
-------
2
(1 row)
你也可以from 9.3 release:
psql -p 5555 t -c "copy tp from program 'zcat /tmp/tp.csv.gz';"
根本没有管道
答案 2 :(得分:1)
如果您使用的是ZIP(.zip)而不是GZIP(.gz)存档,则可以使用psql -p 5555 t -c "copy tp from program 'unzip -p /tmp/tp.csv.zip';"
来传递压缩文件。
//const SchedulerViewEvents=React.memo(({schedule, crafts, defaultView, currentDate, colorBy}) =>
const SchedulerViewEvents=({schedule, crafts, defaultView, currentDate, colorBy }) =>