我有一个很大的压缩 csv 文件(25gb),我想将它导入 PostgreSQL 9.5 版本。有什么快速的方法可以将 zip 或 qzip 文件导入 postgres 而不提取文件?
问问题
11392 次
3 回答
24
使用命名管道有一个老技巧(适用于 Unix,不了解 Windows)
- 创建一个命名管道:
mkfifo /tmp/omyfifo
- 将文件内容写入其中:
zcat mycsv.csv.z > /tmp/omyfifo &
- [来自 psql]
copy mytable(col1,...) from '/tmp/omyfifo'
- [等结束了] :
rm /tmp/omyfifo
在zcat
后台将阻塞,直到阅读器(这里:COPY
命令)开始阅读,并且它将在 EOF 处完成。(或者如果读者关闭管道)
COPY
您甚至可以启动多个管道+zcat 对,这将被您的 sql 脚本中的多个语句拾取。
这将在 pgadmin 中工作,但 fifo(+zcat 进程)应该存在于运行 DBMS 服务器的机器上。
顺便说一句:使用 netcat 的类似技巧可用于从远程机器读取文件(当然应该将文件写入网络套接字)
于 2017-01-19T12:18:56.267 回答
18
示例如何使用zcat
and进行操作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';"
完全没有管道
于 2017-01-19T10:17:30.160 回答
2
如果您有 ZIP (.zip) 而不是 GZIP (.gz) 存档,则可以使用unzip -p
管道传输压缩文件。
psql -p 5555 -t -c "copy tp from program 'unzip -p /tmp/tp.csv.zip';"
于 2020-09-01T15:23:29.427 回答