将压缩的 CSV 文件导入 PostgreSQL

Posted

技术标签:

【中文标题】将压缩的 CSV 文件导入 PostgreSQL【英文标题】:Importing zipped CSV file into PostgreSQL 【发布时间】:2017-06-03 23:27:16 【问题描述】:

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

【问题讨论】:

没有内置任何东西,但copy 可以从程序中获取输入,因此您可以运行解压缩并将输出通过管道传输到copy(或\copy)命令。一些 SQL 客户端也提供该功能 我正在使用没有 zip 文件选项的 pgAdmin III 客户端。使用您提到的这个copy 命令会更快还是先提取文件然后导入postgresql? COPY 是用于从/到 CSV 导入和导出数据的命令,它不能提取 zip 文件。如果你想使用 pgAdmin 导入,你要做的就是提取zip 文件然后使用 COPY 导入提取的 CSV 文件 【参考方案1】:

如果您有 ZIP (.zip) 而不是 GZIP (.gz) 存档,则可以使用 unzip -p 来传输压缩文件。

psql -p 5555 -t -c "copy tp from program 'unzip -p /tmp/tp.csv.zip';"

【讨论】:

【参考方案2】:

示例如何使用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';"

完全没有管道

【讨论】:

使用program 属性,您可以在复制命令本身内移动zcatpsql -p 5555 t -c "copy tp from program 'zcat /tmp/tp.csv.gz';" 运行生成输出的程序的能力是独立有用的。 (postgresql.org/docs/9.5/static/sql-copy.html) true - copy from stdin 无论如何都需要 SU - 所以可能是 copy form program【参考方案3】:

有一个使用命名管道的老技巧(适用于 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 服务器的机器上。


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

【讨论】:

以上是关于将压缩的 CSV 文件导入 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .csv 文件导入 Hasura PostgreSQL 数据库?

如何在windows的“omnidb”中将csv文件数据导入postgresql

将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

PostgreSQL如何导入数据

从命令行导入 PostgreSQL CSV

将 csv 导入到 postgresql:缺少列的数据