Выполните команду copy из postgre в функции и создайте файл - PullRequest
0 голосов
/ 07 февраля 2019

Мое требование - создать функцию для копирования данных из запроса в файл и регистрации их количества.Пример

  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

1 Ответ

0 голосов
/ 08 февраля 2019

Вот пример использования gpfdist и внешней таблицы.Это обеспечит максимальную производительность при записи внешнего файла.Вы также должны знать, что вы можете писать в S3, HDFS и другие с помощью PXF.

Это пример таблицы в 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 (как указано в определении внешней таблицы для записи) запустите gpfdist из bash.

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

В моем тестовом кластере был записан файл с 10000 записейв 143 мс

...