我有一个大型压缩的csv文件(25gb),我想将其导入到PostgreSQL 9.5版本中。有没有一种快速的方法可以在不解压缩文件的情况下将zip或qzip文件导入到postgres中?
我有一个大型压缩的csv文件(25gb),我想将其导入到PostgreSQL 9.5版本中。有没有一种快速的方法可以在不解压缩文件的情况下将zip或qzip文件导入到postgres中?
有一个老的技巧可以使用命名管道(在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服务器的机器上。
顺便说一下:使用netcat的类似技巧可以用于从远程机器读取文件(当然,远程机器应该将文件写入网络套接字)
以下是使用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)
另外,从9.3版本开始,您可以:
psql -p 5555 t -c "copy tp from program 'zcat /tmp/tp.csv.gz';"
完全不使用管道
program
属性,您可以将 zcat
命令嵌入到复制命令中。psql -p 5555 t -c "copy tp from program 'zcat /tmp/tp.csv.gz';"
独立运行生成输出的程序的能力也是非常有用的。(https://www.postgresql.org/docs/9.5/static/sql-copy.html) - Canonical Chrisunzip -p
命令来将压缩文件传输。psql -p 5555 -t -c "copy tp from program 'unzip -p /tmp/tp.csv.zip';"
copy
命令可以从程序获取输入,因此您可以运行解压并将输出导入copy
(或\copy
)命令。一些 SQL 客户端也提供了这个功能。 - user330315copy
命令会更快,还是先提取文件然后导入到postgresql? - Arezoo