Использование коннектора PXF object store для чтения и записи текста фиксированной ширины между S3 и Greengage DB
В этой статье описывается настройка и использование коннектора PXF object store для чтения и записи текста фиксированной ширины в объектном хранилище с использованием внешних таблиц, а также приводятся практические примеры.
Более подробную информацию об опциях форматирования текста фиксированной ширины в Greengage DB можно получить в разделе Форматирование данных фиксированной ширины.
Создание внешней таблицы с использованием протокола PXF
Чтобы создать внешнюю таблицу Greengage DB для чтения и записи текста фиксированной ширины в объектном хранилище, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=<objstore>:fixedwidth[&<custom_option>=<value>[...]]')
FORMAT 'CUSTOM' (FORMATTER='fixedwidth_in | fixedwidth_out',
<field_name>='<width>' [, ...]
[, line_delim[=|<space>][E]'<delim_value>'])
[DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
| Ключевое слово | Значение |
|---|---|
<table_name> |
Имя создаваемой таблицы |
<column_name> |
Имя создаваемого столбца |
<data_type> |
Тип данных создаваемого столбца |
LIKE <other_table> |
Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения |
<path_to_data> |
Путь к каталогу или файлу в объектном хранилище.
Если в конфигурации сервера |
PROFILE=<objstore>:fixedwidth |
Профиль указывается в виде пары Поддерживаются следующие префиксы
|
FORMAT 'CUSTOM' |
Для чтения и записи текста фиксированной ширины в объектном хранилище используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
<field_name>='<width>' |
Имя и ширина поля данных, указываемая в символах.
Поля должны быть перечислены в порядке их физического следования в файле данных.
Имена полей должны совпадать с именами столбцов в команде При чтении данных, если ширина поля меньше значения |
line_delim |
Указывает символ переноса строки в файле данных, по умолчанию |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным.
Если опция опущена, используется конфигурация сервера с именем |
NEWLINE |
Если значение |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
Примеры
Эти примеры демонстрируют настройку и использование коннектора PXF object store для чтения и записи текста фиксированной ширины в объектном хранилище с помощью внешних таблиц.
Конфигурирование коннектора PXF S3
Для того чтобы подключиться к объектному хранилищу с помощью PXF, необходимо создать соответствующую конфигурацию сервера, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
На мастер-хосте Greengage DB войдите под пользователем
gpadmin. -
Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера S3 с именем s3. Скопируйте необходимый для используемого объектного хранилища файл конфигурации сервера из $PXF_HOME/templates в $PXF_BASE/servers/s3. В примере используется файл конфигурации на основе шаблона minio-site.xml.
$ mkdir $PXF_BASE/servers/s3 $ cd $PXF_BASE/servers/s3 $ cp $PXF_HOME/templates/minio-site.xml .В файле конфигурации укажите необходимые данные для подключения к объектному хранилищу:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>fs.s3a.endpoint</name> <value>storage.example.com</value> </property> <property> <name>fs.s3a.access.key</name> <value>${ACCESS_KEY}</value> </property> <property> <name>fs.s3a.secret.key</name> <value>${SECRET_KEY}</value> </property> <property> <name>fs.s3a.fast.upload</name> <value>true</value> </property> <property> <name>fs.s3a.path.style.access</name> <value>true</value> </property> </configuration>ПРИМЕЧАНИЕОбратите внимание, что учетные данные для подключения к объектному хранилищу указываются в виде переменных окружения
ACCESS_KEYиSECRET_KEY.Установить значения этих переменных можно следующим образом:
$ export ACCESS_KEY=<access_key> $ export SECRET_KEY=<secret_key>Учетные данные в файле конфигурации можно указать и в виде обычного текста, но в целях безопасности рекомендуется использовать переменные окружения.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Создание читающей внешней таблицы
-
В бакете customers на хосте S3 создайте файл под названием customers.txt. Файл примера имеет следующую структуру:
-
поле
idдлиной 3 символа; -
поле
nameдлиной 15 символов; -
поле
emailдлиной 25 символов; -
поле
addressдлиной 20 символов.
Обратите внимание, что поля дополнены справа пробелами до требуемой ширины:
1 John Doe john.doe@example.com 123 Elm Street 2 Jane Smith jane.smith@example.com 456 Oak Street 3 Bob Brown bob.brown@example.com 789 Pine Street 4 Rob Stuart rob.stuart@example.com 119 Willow Street -
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на файл customers.txt. В выражении
LOCATIONукажите профильs3:fixedwidthи конфигурацию сервера. В выраженииFORMATукажитеfixedwidth_in— встроенную кастомную функцию форматирования для операций чтения — и перечислите поля данных и их длину:CREATE EXTERNAL TABLE customers_r ( id INTEGER, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers/customers.txt?PROFILE=s3:fixedwidth&SERVER=s3') FORMAT 'CUSTOM' ( FORMATTER='fixedwidth_in', id='3', name='15', email='25', address='20'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r;Вывод должен выглядеть следующим образом:
id | name | email | address ----+------------+------------------------+------------------- 1 | John Doe | john.doe@example.com | 123 Elm Street 2 | Jane Smith | jane.smith@example.com | 456 Oak Street 3 | Bob Brown | bob.brown@example.com | 789 Pine Street 4 | Rob Stuart | rob.stuart@example.com | 119 Willow Street (4 rows)
Создание пишущей внешней таблицы
-
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в бакет customers на хосте S3. В выражении
LOCATIONукажите профильs3:fixedwidthи конфигурацию сервера. В выраженииFORMATукажитеfixedwidth_out— встроенную кастомную функцию форматирования для операций записи — и перечислите поля данных и их длину:CREATE WRITABLE EXTERNAL TABLE customers_w ( id INTEGER, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers?PROFILE=s3:fixedwidth&SERVER=s3') FORMAT 'CUSTOM' ( FORMATTER='fixedwidth_out', id='3', name='15', email='25', address='20'); -
Вставьте тестовые данные в таблицу
customers_w:INSERT INTO customers_w ( id, name, email, address ) VALUES (5, 'Alice Price', 'alice.price@example.com', '234 Maple Avenue'), (6, 'David Lee', 'david.lee@example.com', '567 Birch Lane'), (7, 'Emily Wilson', 'emily.wilson@example.com', '890 Cedar Court'), (8, 'Kevin Garcia', 'kevin.garcia@example.com', '123 Spruce Drive'); -
На хосте S3 просмотрите содержимое файлов, созданных в бакете customers. Оно должно выглядеть следующим образом:
8 Kevin Garcia kevin.garcia@example.com 123 Spruce Drive 5 Alice Price alice.price@example.com 234 Maple Avenue 6 David Lee david.lee@example.com 567 Birch Lane 7 Emily Wilson emily.wilson@example.com 890 Cedar Court