Получение данных из внешних источников с помощью именованных запросов
В Greenplum® для получения данных из внешних СУБД по протоколу PXF можно использовать именованные запросы (named queries).
Именованный запрос — это заранее подготовленный SQL-запрос, который хранится в таблице mdb_toolkit.pxf_named_queries системной базы данных кластера Greenplum®. Ссылка на имя запроса указывается при создании внешней таблицы.
Именованные запросы позволяют объединять (JOIN) таблицы и агрегировать данные во внешнем источнике, когда нет возможности создать представление (VIEW). Поскольку вычисления выполняются во внешнем источнике, это также повышает производительность кластера.
Именованные запросы используются с источниками данных, подключенными к кластеру Greenplum® через JDBC-коннектор.
Чтобы получить данные из внешнего источника с помощью именованного запроса:
- Подготовьте тестовые данные.
- Создайте внешний источник данных.
- Создайте именованный запрос.
- Создайте внешнюю таблицу и получите из нее данные.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за кластер Greenplum®: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий (см. тарифы Yandex MPP Analytics for PostgreSQL).
- Плата за кластер Yandex Managed Service for PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий (см. тарифы Managed Service for PostgreSQL).
- Плата за почасовое использование NAT-шлюзов и исходящий через них трафик (см. тарифы Yandex Virtual Private Cloud).
- Плата за использование публичных IP-адресов (см. тарифы Virtual Private Cloud).
Перед началом работы
Подготовьте инфраструктуру:
-
Создайте кластер Greenplum® любой подходящей конфигурации.
-
В подсети кластера Greenplum® настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
Создайте кластер Managed Service for PostgreSQL с хостами в публичном доступе.
-
В подсети кластера Managed Service for PostgreSQL настройте NAT-шлюз и создайте группу безопасности, разрешающую весь входящий и исходящий трафик со всех адресов.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в рабочую директорию файл
pxf-named-queries-infrastructure.tf. В файле описаны:- сети;
- подсети;
- NAT-шлюзы;
- группы безопасности;
- кластер Greenplum® в сервисе Yandex MPP Analytics for PostgreSQL;
- кластер Managed Service for PostgreSQL;
-
Укажите в файле:
mgp_password— пароль пользователя Greenplum®.mgp_version— версию Greenplum®.mpg_password— пароль пользователя базы данных PostgreSQL.mpg_version— версию PostgreSQL.
-
Для проверки правильности файлов конфигурации выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Подготовьте тестовые данные
-
Подключитесь к базе данных PostgreSQL.
-
Создайте таблицу
customersи добавьте в нее тестовые данные:CREATE TABLE customers(id int, name text, city text); INSERT INTO customers VALUES (111, 'Борис', 'Саратов'); INSERT INTO customers VALUES (222, 'Мария', 'Москва'); INSERT INTO customers VALUES (333, 'Павел', 'Брянск'); INSERT INTO customers VALUES (444, 'Петр', 'Новосибирск'); INSERT INTO customers VALUES (555, 'Наталья', 'Псков'); -
Проверьте результат:
SELECT * FROM customers;id | name | city ----+---------+------------- 111 | Борис | Саратов 222 | Мария | Москва 333 | Павел | Брянск 444 | Петр | Новосибирск 555 | Наталья | Псков -
Создайте таблицу
ordersи добавьте в нее тестовые данные:CREATE TABLE orders(customer_id int, amount int, year int); INSERT INTO orders VALUES (111, 12, 2018); INSERT INTO orders VALUES (222, 234, 2019); INSERT INTO orders VALUES (333, 34, 2018); INSERT INTO orders VALUES (444, 456, 2019); INSERT INTO orders VALUES (555, 56, 2021); -
Проверьте результат:
SELECT * FROM orders;customer_id | amount | year ------------+--------+------ 111 | 12 | 2018 222 | 234 | 2019 333 | 34 | 2018 444 | 456 | 2019 555 | 56 | 2021
Создайте внешний источник данных
В кластере Greenplum® создайте внешний источник данных с параметрами:
- Имя —
pgserver; - Driver —
org.postgresql.Driver; - Url —
jdbc:postgresql://c-<идентификатор_кластера_PostgreSQL>.rw.mdb.yandexcloud.kz:6432/<имя_БД_в_кластере_PostgreSQL>; - User —
<имя_пользователя_PostgreSQL>.
Идентификатор кластера можно получить со списком кластеров в каталоге.
Создайте именованный запрос
Чтобы создать именованный запрос, добавьте его в таблицу mdb_toolkit.pxf_named_queries:
-
Подключитесь к Greenplum®.
-
Выполните запрос:
INSERT INTO mdb_toolkit.pxf_named_queries (pxf_profile, name, query) VALUES ( 'pgserver', 'my_query', 'SELECT c.name, o.year FROM customers c JOIN orders o ON c.id = o.customer_id;' );Где:
pgserver— имя источника данных.my_query— имя именованного запроса.
В качестве примера именованного запроса используется запрос, который объединяет таблицы
customersиordersпо полюid = customer_id, а затем выводит имя клиента (c.name) и год, когда клиент совершал заказы (o.year). -
Проверьте результат:
SELECT * FROM mdb_toolkit.pxf_named_queries;pxf_profile | name | query ------------+-------------+-------------------------------------------- pgserver | my_query | SELECT c.name, o.year | | FROM customers c | | JOIN orders o ON c.id = o.customer_id;В столбце
queryдолжен содержаться текст именованного запроса.
Создайте внешнюю таблицу и получите из нее данные
-
Подключитесь к Greenplum®.
-
Создайте внешнюю таблицу
pxf_named_query. Она будет ссылаться на данные, которые именованный запрос получает из таблицcustomersиordersв БД PostgreSQL:CREATE READABLE EXTERNAL TABLE pxf_named_query(name text, year int) LOCATION ('pxf://query:my_query?PROFILE=JDBC&SERVER=pgserver') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');Подробнее о синтаксисе SQL-запроса для создания внешней таблицы см. в соответствующем разделе.
-
Получите данные:
SELECT * FROM pxf_named_query;Результат:
name | year --------+------ Борис | 2018 Мария | 2019 Павел | 2018 Петр | 2019 Наталья | 2021Совет
Если при выполнении запроса возникает ошибка, подождите несколько минут и попробуйте снова. Возможно, изменения еще не вступили в силу.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
Greenplum® и Greenplum Database® являются зарегистрированными товарными знаками или товарными знаками Broadcom Inc в США и/или других странах.