Создание внешней таблицы по протоколу PXF
Перед началом работы
-
В подсети кластера Greenplum® настройте NAT-шлюз и привяжите таблицу маршрутизации.
-
В той же подсети создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
Создайте внешний источник данных. Инструкции по созданию зависят от типа подключения источника:
Создание внешней таблицы с помощью SQL-запроса
Синтаксис SQL-запроса на создание внешней таблицы:
CREATE [WRITABLE] EXTERNAL TABLE <имя_таблицы>
(<имя_столбца> <тип_данных> [, ...])
LOCATION('pxf://<путь_к_данным_или_имя_таблицы>?PROFILE=<имя_профиля>&SERVER=<имя_источника>')
FORMAT '[TEXT|CSV|CUSTOM]';
Где:
-
<имя_таблицы>— имя внешней таблицы, которая будет создана в кластере Greenplum®. -
<имя_столбца>— имя столбца. -
<тип_данных>— тип данных столбца. Должен совпадать с типом данных столбца таблицы во внешней СУБД. -
<путь_к_данным_или_имя_таблицы>— имя внешнего объекта, см. примеры внешних таблиц. -
PROFILE— стандарт взаимодействия с внешней СУБД (профиль). Например,JDBC. Список возможных значений зависит от типа подключения:- S3
; - JDBC
; - HDFS и Hive
.
- S3
-
SERVER— имя внешнего источника данных PXF.Вместо
SERVERвы можете передать параметры, которые задают конфигурацию внешнего источника данных. Они зависят от типа подключения источника. Подробнее см. в документации Greenplum® PXF и примерах создания внешних таблиц.
Опция WRITABLE позволяет записывать данные во внешний объект. Чтобы считать данные из внешнего объекта, создайте внешнюю таблицу с опцией READABLE.
Примеры создания внешних таблиц
-
Создайте кластер Yandex Managed Service for ClickHouse® с именем пользователя
chuser. -
В подсети кластера настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
(Опционально) Создайте внешний источник данных JDBC с параметрами:
-
Имя —
chserver; -
Driver —
com.clickhouse.jdbc.ClickHouseDriver; -
Url —
jdbc:clickhouse:http://c-<идентификатор_кластера>.rw.mdb.yandexcloud.net:8123/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.net— особый 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.net: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.net: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.net:3306/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.net— особый 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.net: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.net:6432/db1, где:c-<идентификатор_кластера>.rw.mdb.yandexcloud.net— особый 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.net: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.net.
Если не создать источник данных, параметры подключения к источнику нужно передать в 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.net') 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.net') FORMAT 'CSV';
-
-
Добавьте данные в таблицу:
INSERT INTO pxf_s3_write VALUES (3,333);INSERT 0 1 -
Убедитесь, что в бакете создан новый объект.
-
Примечание
Для создания внешней таблицы из Object Storage можно использовать протокол S3, передавая параметры статического ключа в файле, расположенном на веб-сервере. Подробнее см. в руководстве.
Greenplum® и Greenplum Database® являются зарегистрированными товарными знаками или товарными знаками Broadcom Inc в США и/или других странах.
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc