Создание внешней таблицы по протоколу PXF
Yandex MPP Analytics for PostgreSQL позволяет создавать external-таблицы для доступа к данным во внешних СУБД. В кластерах с СУБД Apache Cloudberry™
Механизм FDW поддерживает следующие типы внешних источников данных:
s3_pxf_fdwjdbc_pxf_fdwhdfs_pxf_fdwhive_pxf_fdw
External-таблицы создаются с помощью SQL-запроса CREATE EXTERNAL TABLE, а foreign-таблицы — CREATE FOREIGN TABLE.
Перед началом работы
-
В подсети кластера Yandex MPP Analytics for PostgreSQL настройте NAT-шлюз и привяжите таблицу маршрутизации.
-
В сети кластера Yandex MPP Analytics for PostgreSQL создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
Создайте внешний источник данных. Инструкции по созданию зависят от типа подключения источника:
Создать foreign-таблицу
Синтаксис SQL-запроса на создание foreign-таблицы:
CREATE FOREIGN TABLE <имя_таблицы>
(<имя_столбца> <тип_данных> [, ...])
SERVER "<локальное_имя_источника>"
OPTIONS (
resource '<путь_к_данным_или_имя_таблицы>'
);
Где:
<имя_таблицы>— имя внешней таблицы в кластере Yandex MPP Analytics for PostgreSQL.<имя_столбца>— имя столбца.<тип_данных>— тип данных столбца. Должен совпадать с типом соответствующего столбца во внешней СУБД.<локальное_имя_источника>— локальное имя внешнего источника данных.<путь_к_данным_или_имя_таблицы>— путь к данным или имя таблицы на внешнем источнике.
Примеры создания foreign-таблиц
-
Создайте кластер Yandex Managed Service for ClickHouse® с именем пользователя
chuser. -
В группу безопасности кластера Managed Service for ClickHouse® добавьте правила, разрешающие весь входящий и исходящий трафик.
-
Создайте таблицу в ClickHouse® и заполните ее данными:
-
Подключитесь к БД ClickHouse® с помощью утилиты
clickhouse-client. -
Создайте таблицу
test:CREATE TABLE test ( a INT, b INT ) ENGINE = Memory; -
Добавьте данные:
INSERT INTO test (a, b) VALUES (1, 11), (2, 22);
-
-
Получите доступ к внешним данным в Yandex MPP Analytics for PostgreSQL:
-
Подключитесь к БД в сервисе Yandex MPP Analytics for PostgreSQL.
-
Создайте внешний источник данных:
CREATE SERVER "chserver" FOREIGN DATA WRAPPER jdbc_pxf_fdw OPTIONS ( jdbc_driver 'com.clickhouse.jdbc.ClickHouseDriver', db_url 'jdbc:clickhouse:http://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:8123/<имя_БД>', user 'chuser', pass '<пароль>' );Где
db_url— особый FQDN, который всегда указывает на доступный хост кластера Managed Service for ClickHouse®.Идентификатор кластера можно получить со списком кластеров в каталоге.
Если для хостов ClickHouse® включен публичный доступ, при создании внешней таблицы необходимо использовать шифрованное соединение. Для этого укажите в запросе параметры SSL, используйте протокол
httpsи порт8443:CREATE SERVER "chserver" FOREIGN DATA WRAPPER jdbc_pxf_fdw OPTIONS ( ssl 'true', sslmode 'strict', sslrootcert '/etc/greenplum/ssl/allCAs.pem', jdbc_driver 'com.clickhouse.jdbc.ClickHouseDriver', db_url 'jdbc:clickhouse:https://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:8443/<имя_БД>', user 'chuser', pass '<пароль>' ); -
Создайте сопоставление локального пользователя с пользователем на внешнем источнике:
CREATE USER MAPPING FOR CURRENT_USER SERVER "chserver"; -
Создайте внешнюю таблицу
fdw_ch, которая будет ссылаться на таблицуtestв кластере ClickHouse®:CREATE FOREIGN TABLE fdw_ch ( a INT, b INT ) SERVER "chserver" OPTIONS ( resource 'test' ); -
Получите данные из внешней таблицы:
SELECT * FROM fdw_ch; -
Добавьте данные во внешнюю таблицу:
INSERT INTO fdw_ch (a, b) VALUES (3, 33);
-
-
Создайте кластер Yandex Managed Service for MySQL® с публичным доступом к хостам и именем пользователя
mysqluser. -
В группу безопасности кластера Managed Service for MySQL® добавьте правила, разрешающие весь входящий и исходящий трафик.
-
Создайте таблицу в MySQL® и заполните ее данными:
-
Подключитесь к БД MySQL® с помощью утилиты
mysql. -
Создайте таблицу
test:CREATE TABLE test ( a INT, b INT ); -
Добавьте данные:
INSERT INTO test (a, b) VALUES (1, 11), (2, 22);
-
-
Получите доступ к внешним данным в Yandex MPP Analytics for PostgreSQL:
-
Подключитесь к БД в сервисе Yandex MPP Analytics for PostgreSQL.
-
Создайте внешний источник данных:
CREATE SERVER "myserver" FOREIGN DATA WRAPPER jdbc_pxf_fdw OPTIONS ( jdbc_driver 'com.mysql.jdbc.Driver', db_url 'jdbc:mysql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:3306/<имя_БД>', user 'mysqluser', pass '<пароль>' );Где
db_url— особый FQDN, который всегда указывает на текущий хост-мастер в кластере Managed Service for MySQL®.Идентификатор кластера можно получить со списком кластеров в каталоге.
-
Создайте сопоставление локального пользователя с пользователем на внешнем источнике:
CREATE USER MAPPING FOR CURRENT_USER SERVER "myserver"; -
Создайте внешнюю таблицу
fdw_mysql, которая будет ссылаться на таблицуtestв кластере MySQL®:CREATE FOREIGN TABLE fdw_mysql ( a INT, b INT ) SERVER "myserver" OPTIONS ( resource 'test' ); -
Получите данные из внешней таблицы:
SELECT * FROM fdw_mysql; -
Добавьте данные во внешнюю таблицу:
INSERT INTO fdw_mysql (a, b) VALUES (3, 33);
-
-
Создайте кластер Yandex Managed Service for PostgreSQL с публичным доступом к хостам и именем пользователя
pguser. -
В группу безопасности кластера Managed Service for PostgreSQL добавьте правила, разрешающие весь входящий и исходящий трафик.
-
Создайте таблицу в PostgreSQL и заполните ее данными:
-
Подключитесь к БД PostgreSQL с помощью утилиты
psql. -
Создайте таблицу
test:CREATE TABLE public.test ( a INT, b INT ); -
Добавьте данные:
INSERT INTO public.test (a, b) VALUES (1, 11), (2, 22);
-
-
Получите доступ к внешним данным в Yandex MPP Analytics for PostgreSQL:
-
Подключитесь к БД в сервисе Yandex MPP Analytics for PostgreSQL.
-
Создайте внешний источник данных:
CREATE SERVER "pgserver" FOREIGN DATA WRAPPER jdbc_pxf_fdw OPTIONS ( jdbc_driver 'org.postgresql.Driver', db_url 'jdbc:postgresql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6432/<имя_БД>', user 'pguser', pass '<пароль>' );Где
db_url— особый FQDN, который всегда указывает на текущий хост-мастер в кластере Managed Service for PostgreSQL.Идентификатор кластера можно получить со списком кластеров в каталоге.
-
Создайте сопоставление локального пользователя с пользователем на внешнем источнике:
CREATE USER MAPPING FOR CURRENT_USER SERVER "pgserver"; -
Создайте внешнюю таблицу
fdw_pg, которая будет ссылаться на таблицуpublic.testв кластере PostgreSQL:CREATE FOREIGN TABLE fdw_pg ( a INT, b INT ) SERVER "pgserver" OPTIONS ( resource 'public.test' ); -
Получите данные из внешней таблицы:
SELECT * FROM fdw_pg; -
Добавьте данные во внешнюю таблицу:
INSERT INTO fdw_pg (a, b) VALUES (3, 33);
-
-
Создайте сервисный аккаунт
fdw-agentи назначьте ему рольstorage.editorдля доступа к бакету Object Storage. -
Создайте бакет Object Storage с ограниченным доступом.
-
Предоставьте разрешение
READ и WRITEдля сервисного аккаунтаfdw-agentна созданный бакет. -
Подготовьте тестовый файл и загрузите его в бакет:
-
На локальной машине создайте тестовый файл
test.csv:1,11 2,22 -
Загрузите в бакет файл
test.csv.
-
-
Получите доступ к внешним данным в Yandex MPP Analytics for PostgreSQL:
-
Подключитесь к БД в сервисе Yandex MPP Analytics for PostgreSQL.
-
Создайте внешний источник данных:
CREATE SERVER "objserver" FOREIGN DATA WRAPPER s3_pxf_fdw OPTIONS ( accesskey '<идентификатор_статического_ключа_доступа>', secretkey '<секретный_ключ_доступа>', endpoint 'storage.yandexcloud.kz' ); -
Создайте сопоставление локального пользователя с пользователем на внешнем источнике:
CREATE USER MAPPING FOR CURRENT_USER SERVER "objserver"; -
Создайте внешнюю таблицу
fdw_s3, которая будет ссылаться на таблицуtest.csvв бакете:CREATE FOREIGN TABLE fdw_s3 ( a INT, b INT ) SERVER "objserver" OPTIONS ( resource '<имя_бакета>/test.csv', format 'csv' ); -
Получите данные из внешней таблицы:
SELECT * FROM fdw_s3;
-
Совет
Параметры подключения можно передавать как при создании источника данных, так и при создании внешней таблицы.
Передача параметров подключения при создании внешней таблицы
CREATE SERVER "<локальное_имя_источника>"
FOREIGN DATA WRAPPER jdbc_pxf_fdw;
CREATE USER MAPPING FOR CURRENT_USER
SERVER "<локальное_имя_источника>";
CREATE FOREIGN TABLE <имя_таблицы>
(<имя_столбца> <тип_данных> [, ...])
SERVER "<локальное_имя_источника>"
OPTIONS (
resource '<путь_к_данным_или_имя_таблицы>',
jdbc_driver '<имя_класса_JDBC_драйвера>',
db_url 'jdbc:<тип_СУБД>://<FQDN_кластера>:<порт>/<имя_БД>',
user '<имя_пользователя>',
pass '<пароль>'
);
Создать external-таблицу
Синтаксис SQL-запроса на создание external-таблицы:
CREATE [WRITABLE] EXTERNAL TABLE <имя_таблицы>
(<имя_столбца> <тип_данных> [, ...])
LOCATION('pxf://<путь_к_данным_или_имя_таблицы>?PROFILE=<имя_профиля>&SERVER=<имя_источника>')
FORMAT '[TEXT|CSV|CUSTOM]';
Где:
-
<имя_таблицы>— имя внешней таблицы, которая будет создана в кластере Yandex MPP Analytics for PostgreSQL. -
<имя_столбца>— имя столбца. -
<тип_данных>— тип данных столбца. Должен совпадать с типом данных столбца таблицы во внешней СУБД. -
<путь_к_данным_или_имя_таблицы>— имя внешнего объекта, см. примеры внешних таблиц. -
PROFILE— стандарт взаимодействия с внешней СУБД (профиль). Например,JDBC. Список возможных значений зависит от типа подключения:- S3
; - JDBC
; - HDFS и Hive
.
- S3
-
SERVER— имя внешнего источника данных PXF.Вместо
SERVERвы можете передать параметры, которые задают конфигурацию внешнего источника данных. Они зависят от типа подключения источника. Подробнее см. в документации Greenplum® PXF и примерах создания внешних таблиц.
Опция WRITABLE позволяет записывать данные во внешний объект. Чтобы считать данные из внешнего объекта, создайте внешнюю таблицу с опцией READABLE.
Примеры создания external-таблиц
-
Создайте кластер Yandex Managed Service for ClickHouse® с именем пользователя
chuser. -
В подсети кластера настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
(Опционально) Создайте внешний источник данных JDBC с параметрами:
-
Имя —
chserver; -
Driver —
com.clickhouse.jdbc.ClickHouseDriver; -
Url —
jdbc:clickhouse:http://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:8123/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz— особый FQDN, который всегда указывает на доступный хост кластера Managed Service for ClickHouse®.8123— порт для подключения к кластеру Managed Service for ClickHouse®.db1— имя БД в кластере Managed Service for ClickHouse®.
-
User —
chuser.
Идентификатор кластера можно получить со списком кластеров в каталоге.
Если не создать источник данных, параметры подключения к источнику нужно передать в SQL-запросе на создание внешней таблицы.
-
-
Подключитесь к БД ClickHouse® с помощью утилиты
clickhouse-client. -
Создайте тестовую таблицу и наполните ее данными:
CREATE TABLE test (id int) ENGINE = Memory;INSERT INTO test VALUES (1); -
Создайте внешнюю таблицу
pxf_ch, которая будет ссылаться на таблицуtestв кластере ClickHouse®. SQL-запрос зависит от того, был ли создан ранее внешний источник данных:-
С источником данных:
CREATE READABLE EXTERNAL TABLE pxf_ch(id int) LOCATION ('pxf://test?PROFILE=JDBC&SERVER=chserver') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Без источника данных:
CREATE READABLE EXTERNAL TABLE pxf_ch(id int) LOCATION ('pxf://test?PROFILE=JDBC&JDBC_DRIVER=com.clickhouse.jdbc.ClickHouseDriver&DB_URL=jdbc:clickhouse:http://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:8123/db1&USER=chuser') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
Если для хостов ClickHouse® включен публичный доступ, при создании внешней таблицы необходимо использовать шифрованное соединение. Для этого укажите в запросе параметры SSL:
-
С источником данных:
CREATE READABLE EXTERNAL TABLE pxf_ch(id int) LOCATION ('pxf://test?PROFILE=JDBC&SERVER=chserver&ssl=true&sslmode=strict&sslrootcert=/etc/greenplum/ssl/allCAs.pem') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Без источника данных:
CREATE READABLE EXTERNAL TABLE pxf_ch(id int) LOCATION ('pxf://test?PROFILE=JDBC&JDBC_DRIVER=com.clickhouse.jdbc.ClickHouseDriver&DB_URL=jdbc:clickhouse:https://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:8443/db1&USER=chuser&ssl=true&sslmode=strict&sslrootcert=/etc/greenplum/ssl/allCAs.pem') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
-
-
Получите данные из внешней таблицы:
SELECT * FROM pxf_ch;Результат:
test_pxf=> SELECT * FROM pxf_ch; id ---- 1 (1 row)
-
Создайте кластер Yandex Managed Service for MySQL® с настройками:
- Имя пользователя —
mysqluser. - В настройках хостов выберите опцию Публичный доступ.
- Имя пользователя —
-
В подсети кластера настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
(Опционально) Создайте внешний источник данных JDBC с параметрами:
-
Имя —
mysqlserver; -
Driver —
com.mysql.jdbc.Driver; -
Url —
jdbc:mysql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:3306/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz— особый FQDN, который всегда указывает на текущий хост-мастер в кластере Managed Service for MySQL®.3306— порт для подключения к кластеру Managed Service for MySQL®.db1— имя БД в кластере Managed Service for MySQL®.
-
User —
mysqluser.
Идентификатор кластера можно получить со списком кластеров в каталоге.
Если не создать источник данных, параметры подключения к источнику нужно передать в SQL-запросе на создание внешней таблицы.
-
-
Подключитесь к БД MySQL® с помощью утилиты
mysql. -
Создайте тестовую таблицу и наполните ее данными:
CREATE TABLE test (a INT, b INT);INSERT INTO test VALUES (1, 11), (2, 22); -
Создайте внешнюю таблицу
pxf_mysql, которая будет ссылаться на таблицуtestв кластере MySQL®. SQL-запрос зависит от того, был ли создан ранее внешний источник данных:-
С источником данных:
CREATE READABLE EXTERNAL TABLE pxf_mysql(a int, b int) LOCATION ('pxf://test?PROFILE=JDBC&SERVER=mysqlserver') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Без источника данных:
CREATE READABLE EXTERNAL TABLE pxf_mysql(a int, b int) LOCATION ('pxf://test?PROFILE=JDBC&JDBC_DRIVER=com.mysql.jdbc.Driver&DB_URL=jdbc:mysql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:3306/db1&USER=mysqluser') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
-
-
Получите данные из внешней таблицы:
SELECT * FROM pxf_mysql;Результат:
test_pxf=> SELECT * FROM pxf_mysql; a | b --+---- 1 | 11 2 | 22 (2 rows)
-
Создайте кластер Yandex Managed Service for PostgreSQL с настройками:
- Имя пользователя —
pguser; - В настройках хостов выберите опцию Публичный доступ.
- Имя пользователя —
-
В подсети кластера настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
(Опционально) Создайте внешний источник данных JDBC с параметрами:
-
Имя —
pgserver; -
Driver —
org.postgresql.Driver; -
Url —
jdbc:postgresql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6432/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz— особый FQDN, который всегда указывает на текущий хост-мастер в кластере Managed Service for PostgreSQL.6432— порт для подключения к кластеру Managed Service for PostgreSQL.db1— имя БД в кластере Managed Service for PostgreSQL.
-
User —
pguser.
Идентификатор кластера можно получить со списком кластеров в каталоге.
Если не создать источник данных, параметры подключения к источнику нужно передать в SQL-запросе на создание внешней таблицы.
-
-
Подключитесь к БД PostgreSQL с помощью утилиты
psql. -
Создайте тестовую таблицу и наполните ее данными:
CREATE TABLE public.test ("a" INT,"b" INT);INSERT INTO public.test VALUES (1, 11), (2, 22); -
Создайте внешнюю таблицу
pxf_pg, которая будет ссылаться на таблицуpublic.testв кластере PostgreSQL. SQL-запрос зависит от того, был ли создан ранее внешний источник данных:-
С источником данных:
CREATE READABLE EXTERNAL TABLE pxf_pg(a int, b int) LOCATION ('pxf://public.test?PROFILE=JDBC&SERVER=pgserver') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Без источника данных:
CREATE READABLE EXTERNAL TABLE pxf_pg(a int, b int) LOCATION ('pxf://public.test?PROFILE=JDBC&JDBC_DRIVER=org.postgresql.Driver&DB_URL=jdbc:postgresql://c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6432/db1&USER=pguser') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
-
-
Получите данные из внешней таблицы:
SELECT * FROM pxf_pg;Результат:
test_pxf=> SELECT * FROM pxf_pg; a | b --+---- 1 | 11 2 | 22 (2 rows)
-
В подсети кластера настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
Создайте бакет Object Storage с ограниченным доступом.
-
(Опционально) Создайте внешний источник данных S3 с параметрами:
- Имя —
objserver; - Access Key — идентификатор статического ключа доступа, созданного ранее;
- Secret Key — секретный ключ, созданный ранее вместе со статическим ключом доступа;
- Endpoint —
storage.yandexcloud.kz.
Если не создать источник данных, параметры подключения к источнику нужно передать в SQL-запросе на создание внешней таблицы.
- Имя —
-
На локальной машине создайте тестовый файл
test.csv:1,111 2,222 -
Загрузите тестовый файл в бакет.
Файлы, которые вы загружаете в бакет, не должны начинаться с символов
.и_. Такие файлы считаются скрытыми, и PXF не считывает из них данные. -
Чтобы считать данные из бакета Object Storage:
-
Создайте внешнюю таблицу
pxf_s3_read, которая будет ссылаться на бакет. SQL-запрос зависит от того, был ли создан ранее внешний источник данных:-
С источником данных:
CREATE READABLE EXTERNAL TABLE pxf_s3_read(a int, b int) LOCATION ('pxf://<имя_бакета>/test.csv?PROFILE=s3:text&SERVER=objserver') FORMAT 'CSV'; -
Без источника данных:
CREATE READABLE EXTERNAL TABLE pxf_s3_read(a int, b int) LOCATION ('pxf://<имя_бакета>/test.csv?PROFILE=s3:text&accesskey=<идентификатор_ключа>&secretkey=<секретный_ключ>&endpoint=storage.yandexcloud.kz') FORMAT 'CSV';
-
-
Получите данные из внешней таблицы:
SELECT * FROM pxf_s3_read;Результат:
test_pxf=> SELECT * FROM pxf_s3_read; a | b ---+---- 1 | 111 2 | 222 (2 rows)
-
-
Чтобы записать данные в бакет Object Storage:
-
Создайте внешнюю таблицу
pxf_s3_writeс опциейWRITABLE. Имя файла при создании таблицы указывать не нужно:-
С источником данных:
CREATE WRITABLE EXTERNAL TABLE pxf_s3_write(a int, b int) LOCATION ('pxf://<имя_бакета>/?PROFILE=s3:text&SERVER=objserver') FORMAT 'CSV'; -
Без источника данных:
CREATE WRITABLE EXTERNAL TABLE pxf_s3_write(a int, b int) LOCATION ('pxf://<имя_бакета>/?PROFILE=s3:text&accesskey=<идентификатор_ключа>&secretkey=<секретный_ключ>&endpoint=storage.yandexcloud.kz') FORMAT 'CSV';
-
-
Добавьте данные в таблицу:
INSERT INTO pxf_s3_write VALUES (3,333);INSERT 0 1 -
Убедитесь, что в бакете создан новый объект.
-
Примечание
Для создания внешней таблицы из Object Storage можно использовать протокол S3, передавая параметры статического ключа в файле, расположенном на веб-сервере. Подробнее см. в руководстве.
Greenplum® и Greenplum Database® являются зарегистрированными товарными знаками или товарными знаками Broadcom Inc в США и/или других странах.
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc