【问题标题】:Greenplum to file using PSQLGreenplum 使用 PSQL 归档
【发布时间】:2016-07-05 17:49:01
【问题描述】:

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

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

注意:我只允许使用 \copy。由于我的文件很大,我在使用 SED 或 Perl 进行查找和替换时遇到空间问题

【问题讨论】:

  • 额外的“\”是因为它是转义字符,所以psql正在转义转义字符。如果您不想这样做,则需要指定不同的转义字符。您可以将分隔符更改为空格,但分隔符不支持多个字符。它必须是单字节字符分隔符。
  • 谢谢...如果您告诉我如何使用不同的转义字符会很棒...但我不会更改分隔符,即管道

标签: copy psql greenplum


【解决方案1】:

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

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,但就像我说的,它比使用可写外部表要慢。

【讨论】:

  • 超级...感谢您的帮助...您的回复让我有了新的学习
  • 必须启动gpfdist 进程可能应该添加到教程页面:gpfdist example。在偶然发现这个答案之前,我挣扎了很多。特别是因为 gpfdist > 复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多