2016-07-05 31 views
0

我试图使用PSQL和\ copy从管道分隔符将数据从Green-plum导出到文本文件(客户端)。在输出我看到单斜杠转换为双斜杠和选项卡转换\吨。 示例 N \ A转换为N \\ AGreenplum使用PSQL文件

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

注意:我只允许使用\ copy。由于我的文件是巨大的我得到空间问题,而使用SED或Perl查找和替换

+0

额外的“\”是因为它是转义字符,所以psql正在转义转义字符。如果你不需要,你需要指定一个不同的转义字符。您可以将分隔符更改为空格,但分隔符不支持多个字符。它必须是单字节字符分隔符。 –

+0

谢谢......如果你告诉我如何使用不同的转义字符......但我不会改变管道的分隔符 – Karthik

回答

0

假设你没有任何“^”字符,你可以使用它作为转义字符。

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

更多副本可以在这里找到:https://www.postgresql.org/docs/8.2/static/sql-copy.html

这种技术将相对缓慢,并把负担法师。如果您使用gpfdist,则可以利用集群中的并行机制并绕过主机。该解决方案非常适合卸载大量数据。

首先启动gpfidst过程:现在

[[email protected] ~]$ gpfdist -p 8888 > gpfdist_8888.log 2>&1 < gpfdist_8888.log & 
[1] 2255 

,您可以创建外部表。

[[email protected] ~]$ 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 

验证:

[[email protected] ~]$ wc -l call_center.txt 
6 call_center.txt 

在我的例子,我使用的主机名 “gpdbsne”,这是在这个集群中的所有段访问。通常情况下,Greenplum使用专用网络进行段间通信,因此该主机名需要连接到专用网络。

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

+0

超级......感谢您的帮助......您的回复给了我一个新的学习 – Karthik