我尝试使用PSQL和\ copy将数据从Green-plum导出到带有管道分隔符的文本文件(客户端)。在输出中,我看到单斜杠被转换为双斜杠并且tab被转换为\ t。 例 N \ A转换为N \\ A
那么如何得到N \ A而不是N \\ A而只是空格而不是\ t?
注意:我只允许使用\ copy。由于我的文件非常大,因此在使用SED或Perl进行查找和替换时会出现空间问题
答案 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,但就像我说的那样,它比使用可写外部表要慢。