Создание внешней таблицы по протоколу PXF
Перед началом работы
-
В подсети кластера Managed Service for 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
; - 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
; - 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
; - 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® являются зарегистрированными товарными знаками или товарными знаками VMware, Inc в США и/или других странах.
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc