Greenplum使用PSQL文件

时间:2016-07-05 17:49:01

标签: copy psql greenplum

我尝试使用PSQL和\ copy将数据从Green-plum导出到带有管道分隔符的文本文件(客户端)。在输出中,我看到单斜杠被转换为双斜杠并且tab被转换为\ t。 例     N \ A转换为N \\ A

那么如何得到N \ A而不是N \\ A而只是空格而不是\ t?

注意:我只允许使用\ copy。由于我的文件非常大,因此在使用SED或Perl进行查找和替换时会出现空间问题

1 个答案:

答案 0 :(得分:0)

假设您没有任何“^”字符,则可以将其用作转义字符。

copy tpcds.call_center to stdout with delimiter '|' escape '^';

有关复制的更多信息,请访问:https://www.postgresql.org/docs/8.2/static/sql-copy.html

这种技术会相对缓慢并给主人带来负担。如果您使用gpfdist,则可以利用群集中的并行性并绕过主服务器。该解决方案非常适合卸载大量数据。

首先,启动gpfidst进程:

[gpadmin@gpdbsne ~]$ gpfdist -p 8888 > gpfdist_8888.log 2>&1 < gpfdist_8888.log &
[1] 2255

现在,您可以创建外部表。

[gpadmin@gpdbsne ~]$ psql 
SET
Timing is on.
psql (8.2.15)
Type "help" for help.

gpadmin=# create writable external table tpcds.et_call_center 
(like tpcds.call_center) 
location ('gpfdist://gpdbsne:8888/call_center.txt') 
format 'text' (delimiter '|' escape '^');
NOTICE:  Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table
CREATE EXTERNAL TABLE
Time: 18.681 ms

现在,您插入数据:

gpadmin=# insert into tpcds.et_call_center select * from tpcds.call_center;                                                                             
INSERT 0 6
Time: 72.653 ms
gpadmin=# \q

验证

[gpadmin@gpdbsne ~]$ wc -l call_center.txt 
6 call_center.txt

在我的示例中,我使用了主机名“gpdbsne”,该群集中的所有段都可以访问该主机名。通常,Greenplum使用专用网络在段之间进行通信,因此该主机名需要连接到专用网络。

由于可写外部表是用SQL编写的,因此您可以在SQL中使用所需的任何转换逻辑,这样您就可以根据需要将制表符更改为空格。这消除了对文件进行后处理的awk或sed的需要。复制也可以使用SQL,但就像我说的那样,它比使用可写外部表要慢。