将压缩的CSV文件导入PostgreSQL

时间:2017-01-19 10:00:28

标签: postgresql csv import named-pipes postgresql-copy

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

3 个答案:

答案 0 :(得分:16)

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

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

背景中的zcat将阻塞,直到读者(此处:COPY命令)将开始阅读,并且它将在EOF结束。 (或者如果读者关闭管道)

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

这将在pgadmin中运行,但是fifo(+ zcat进程)应该存在于运行DBMS服务器的机器上。

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

答案 1 :(得分:7)

示例如何使用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)

你也可以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  }) =>