从函数中的 postgres 执行复制命令并创建文件

Posted

技术标签:

【中文标题】从函数中的 postgres 执行复制命令并创建文件【英文标题】:Execute copy command from postgre in function and create a file 【发布时间】:2019-02-07 20:15:11 【问题描述】:

我的要求就像创建一个函数来将数据从查询复制到文件并捕获它的计数。示例

  Create function xoy(query,path) returns integer as
   Copy (query) to stdout >path of file
    Get row_count of the query above
    Close

以上是需要的基本逻辑,请帮忙 Postgre SQL 8.3,greenplum

【问题讨论】:

使用带有 gpfdist 的外部表来写入该文件会更快。另外,文件创建后你打算怎么处理? 【参考方案1】:

这是使用 gpfdist 和外部表的示例。这将为写入外部文件提供最快的性能。您还应该知道,您可以使用 PXF 写入 S3、HDFS 和其他。

这是 Greenplum 中的示例表:

create table foo
(id int,
 fname text,
 lname text,
 city text,
 state text,
 zip text)
distributed by (id);

为此示例插入一些虚拟数据:

insert into foo 
(id, fname, lname, city, state, zip)
select i, 'foo_' || i, 'bar_' || i, 'city_' || i, 'state_' || i, 'zip_' || i
from generate_series(1, 10000) as i;

这是一个使用 gpfdist 的可写外部表。

create writable external table ext_foo
(like foo)
location ('gpfdist://mdw:8999/foo.txt')
format 'text' (delimiter '|' null as '')
distributed by (id);

这是您要使用的函数:

create or replace function fn_export_foo() returns void as
$$
declare

begin
    insert into ext_foo 
    select * from foo;
end

$$
language plpgsql;

现在,在 mdw 主机上(在可写外部表定义中指定),从 bash 启动 gpfdist。

gpfdist -p 8999 > gpfdist_8999.log 2>&1 < gpfdist_8999.log &

现在执行函数:

select fn_export_foo();

结果如下:

[gpadmin@mdw ~]$ head foo.txt 
42|foo_42|bar_42|city_42|state_42|zip_42
74|foo_74|bar_74|city_74|state_74|zip_74
90|foo_90|bar_90|city_90|state_90|zip_90
122|foo_122|bar_122|city_122|state_122|zip_122
234|foo_234|bar_234|city_234|state_234|zip_234
250|foo_250|bar_250|city_250|state_250|zip_250
293|foo_293|bar_293|city_293|state_293|zip_293
325|foo_325|bar_325|city_325|state_325|zip_325
341|foo_341|bar_341|city_341|state_341|zip_341
373|foo_373|bar_373|city_373|state_373|zip_373

在我的测试集群中,包含 10,000 条记录的文件在 143 毫秒内写入。

【讨论】:

唯一在我身边的是,每次生成文件时我的查询都会改变,所以我不能使用表 该示例使用表格提供示例数据。它不必是表,但可以是查询。此查询插入到外部表中 - 这只是写出数据的工具。

以上是关于从函数中的 postgres 执行复制命令并创建文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用复制命令在 postgres 中将数据从一个表复制到另一个表

从雪花中的 Postgres 复制 FILTER 子句

将数据从 AWS S3 复制到 Aurora Postgres

使用 Node.js 从 Redshift 将数据复制到 postgres

无法执行 plpgsql/postgres 中的函数

postgres中的交叉表函数不返回表中的任何值