2014-10-28 64 views
0

我有以下两个文件,第一个是数据文件,第一列是行的唯一标识符,第二列表示id字段后面的字段字典。从文件中将数据加载到Postgres中

> cat data 
1,NULL,37,M,NULL 
2,NULL,25,F,NULL 
3,NULL,42,F,NULL 
4,NULL,18,M,NULL 

> cat .dictionary 
0,balance|double 
1,age|int 
2,gender|string 
3,state|string 

数据文件的大小可能非常大。

如何将这些数据导入Postgres?我应该编写自己的自定义数据加载程序来分析这些文件并创建一个可以使用的.sql文件吗?或者通过JDBC直接连接到数据库并以这种方式加载?

+0

使用副本:http://www.postgresql.org/docs/9.2/static/sql-copy.html。 – 2014-10-28 01:03:18

回答

1

创建表来保存这些数据,然后使用COPY

create table Table1 
(
balance double precision, 
age  int, 
gender varchar(10), 
state varchar(10) 
); 

COPY Table1 FROM '/home/abc/data.txt' DELIMITER ',' CSV; 
+0

好吧,这可能会工作 - 我想尽管编程 - 即。我不希望这是一个手动过程。我猜它可以以某种方式编写脚本? – jcm 2014-10-28 03:32:02

0

正如@雷达的答案的一个变种,在创建表后,在PSQL\copy命令可以使用。它包装COPY,但在为本地文件系统(即您的计算机)提供所需权限方面提供了一些优势,而不是服务器,您可能不一定具有所需的权限。

它可能比服务器端COPY慢,因为它不是纯粹的服务器端,但它是我通常在我需要做这种事情时使用的方法,并且我发现性能通常很好。

作为一个相关的问题,我发现当复制这样的数据时,性能问题的最大原因是表上的索引和约束。如果你正在复制一个已经存在的表,并且它有很多数据,我会建议删除它们,复制它们,然后再重新应用它们。对于新表,请等到复制后创建任何索引或约束。差别可以是数量级。

有关\copy的更多详细信息,请参阅psql doc

相关问题