将压缩的CSV文件导入PostgreSQL

Are*_*zoo 7 csv postgresql import named-pipes postgresql-copy

我有一个很大的压缩csv文件(25gb),我想将它导入PostgreSQL 9.5版本.有没有快速的方法将zip或qzip文件导入postgres而不解压缩文件?

joo*_*oop 18

使用命名管道有一个老技巧(适用于Unix,不了解Windows)

  • 创建命名管道: mkfifo /tmp/omyfifo
  • 将文件内容写入其中: zcat mycsv.csv.z > /tmp/omyfifo &
  • [来自psql] copy mytable(col1,...) from '/tmp/omyfifo'
  • [等结束了] : rm /tmp/omyfifo

zcat在backgound将阻塞,直到一个读者(这里的COPY命令)将开始读取,并且将在EOF结束.(或者如果读者关闭管道)

您甚至可以启动多个管道+ zcat对,这将由COPY您的sql脚本中的多个语句选取.


这将在pgadmin中运行,但fifo(+ zcat进程)应该出现在运行DBMS服务器的机器上.


顺便说一句:使用netcat的类似技巧可用于从远程机器读取文件(当然应该将文件写入网络套接字)


Vao*_*sun 8

示例如何使用zcatpipe:

-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)
Run Code Online (Sandbox Code Playgroud)

也可以从9.3版本开始:

psql -p 5555 t -c "copy tp from program 'zcat /tmp/tp.csv.gz';"
Run Code Online (Sandbox Code Playgroud)

没有管道

  • 使用 `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) (2认同)