Использование коннектора PXF File для чтения и записи данных между NFS в Greengage DB
Коннектор PXF File позволяет читать и записывать данные, расположенные в сетевой файловой системе (Network File System), смонтированной на хостах Greengage DB.
В этой статье описывается настройка и использование коннектора PXF File для чтения и записи данных в NFS с использованием внешних таблиц, а также приводятся практические примеры.
Перед началом работы убедитесь, что:
-
Файлы доступны пользователю
gpadminили пользователю операционной системы, запустившему процесс PXF. -
Сетевая файловая система корректно смонтирована в одной и той же локальной точке монтирования на каждом хосте Greengage DB.
-
Создана одна или несколько конфигураций сервера PXF, как описано в разделе Конфигурирование сервера PXF для сетевой файловой системы.
Поддерживаемые типы файлов
С помощью коннектора PXF File можно производить чтение и запись данных в файлах следующих типов.
| Тип файла | Имя профиля | Поддерживаемые операции |
|---|---|---|
Однострочные текстовые значения с разделителями |
file:text |
Чтение, запись |
Однострочные разделенные запятыми текстовые значения (CSV) |
file:csv |
Чтение, запись |
Текстовые значения с разделителями, заключенными в кавычки |
file:text:multi |
Чтение |
Однострочные текстовые значения фиксированной ширины |
file:fixedwidth |
Чтение, запись |
Avro |
file:avro |
Чтение, запись |
JSON |
file:json |
Чтение, запись |
ORC |
file:orc |
Чтение, запись |
Parquet |
file:parquet |
Чтение, запись |
Создание внешней таблицы с использованием протокола PXF
Чтобы создать внешнюю таблицу Greengage DB для чтения и записи данных в NFS, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=file:<file_type>[&SERVER=<server_name>][&<custom-option>=<value>[...]]')
FORMAT '[TEXT|CSV|CUSTOM]' (<formatting-properties>)
[DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
| Ключевое слово | Значение |
|---|---|
<table_name> |
Имя создаваемой таблицы |
<column_name> |
Имя создаваемого столбца |
<data_type> |
Тип данных создаваемого столбца |
LIKE <other_table> |
Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения |
<path_to_data> |
Путь к каталогу или файлу в NFS.
Путь трактуется как относительный к базовому пути, указанному в качестве значения свойства |
PROFILE=file:<file_type> |
Профиль указывается как пара |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным.
Если опция опущена, используется конфигурация сервера с именем |
<custom‑option>=<value> |
Одна из опций, указываемая в строке |
FORMAT <value> |
Формат данных, принимающий значения |
<formatting‑properties> |
Опции форматирования, поддерживаемые выбранным профилем. Подробнее см. в разделе Опции, формат данных и свойства форматирования |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
Примеры
Эти примеры демонстрируют настройку и использование коннектора PXF File для чтения и записи данных CSV в NFS с помощью внешних таблиц.
Примеры предполагают, что сетевая файловая система с точкой монтирования /mnt/extdata/pxf настроена и смонтирована на каждом хосте кластера Greengage DB.
Конфигурирование сервера PXF для сетевой файловой системы
Для того чтобы подключиться к NFS с помощью PXF, необходимо создать конфигурацию сервера, как описано в статье Настройка PXF-сервера документации PXF, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
На мастер-хосте Greengage DB войдите под пользователем
gpadmin. -
Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера для сетевой файловой системы (например, с именем nfs):
$ mkdir $PXF_BASE/servers/nfs -
Скопируйте шаблон файла конфигурации $PXF_HOME/templates/pxf-site.xml в каталог $PXF_BASE/servers/nfs:
$ cd $PXF_BASE/servers/nfs $ cp $PXF_HOME/templates/pxf-site.xml . -
В файле конфигурации требуется указать два обязательных свойства:
-
pxf.fs.basePathопределяет базовый путь к общему каталогу сетевой файловой системы. Путь к файлам, указанный в выраженииLOCATIONкомандыCREATE EXTERNAL TABLE, трактуется как относительный к базовому пути. -
pxf.service.user.impersonationуправляет имперсонацией пользователей. PXF не поддерживает имперсонацию для NFS и производит доступ от имени пользователя, который запустил процесс PXF, обычноgpadmin. По этой причине имперсонация пользователей должна быть явно отключена.
Откройте файл конфигурации в текстовом редакторе и установите требуемые значения свойств. Например, если общий каталог NFS — /mnt/extdata/pxf, установите его как значение свойства
pxf.fs.basePath:<?xml version="1.0" encoding="UTF-8"?> <configuration> ... <property> <name>pxf.service.user.impersonation</name> <value>false</value> </property> <property> <name>pxf.fs.basePath</name> <value>/mnt/extdata/pxf</value> </property> ... </configuration> -
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Чтение CSV-файла из NFS
-
В общем каталоге NFS создайте CSV-файл с именем customers.csv и следующим содержимым:
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.csv. В выражении
LOCATIONукажите профильfile:csvи конфигурацию сервера. В выраженииFORMATукажитеCSVв качестве формата данных:CREATE EXTERNAL TABLE customers_r ( id INTEGER, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100), address VARCHAR(255) ) LOCATION ('pxf://customers.csv?PROFILE=file:csv&SERVER=nfs') FORMAT 'CSV'; -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r;Вывод должен выглядеть следующим образом:
id | first_name | last_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)
Запись CSV-файла в NFS
-
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, которая записывает данные в подкаталог customers общего каталога NFS. В выражении
LOCATIONукажите профильfile:csvи конфигурацию сервера. В выраженииFORMATукажитеCSVв качестве формата данных:CREATE WRITABLE EXTERNAL TABLE customers_w ( id INTEGER, first_name TEXT, last_name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers?PROFILE=file:csv&SERVER=nfs') FORMAT 'CSV'; -
Вставьте тестовые данные в созданную внешнюю таблицу:
INSERT INTO customers_w ( id, first_name, last_name, email, address ) VALUES (5,'Alice','Johnson','alice.johnson@example.com','10 Oak Avenue'), (6,'Charlie','Williams','charlie.williams@example.com','42 Maple Drive'), (7,'Bob','Smith','bob.smith@example.com','7 Pine Court'), (8,'Eve','Brown','eve.brown@example.com','12 Birch Lane'); -
Просмотрите содержимое подкаталога customers общего каталога NFS. Список файлов должен выглядеть подобным образом:
230-0000000016_0 230-0000000016_1 230-0000000016_2 230-0000000016_3
-
Проверьте содержимое созданных файлов. Вывод должен выглядеть следующим образом:
8,Eve,Brown,eve.brown@example.com,12 Birch Lane 6,Charlie,Williams,charlie.williams@example.com,42 Maple Drive 7,Bob,Smith,bob.smith@example.com,7 Pine Court 5,Alice,Johnson,alice.johnson@example.com,10 Oak Avenue
Опции, формат данных и свойства форматирования
Опции, формат данных и свойства форматирования, указываемые при создании внешней таблицы, которая ссылается на файл в сетевой файловой системе, зависят от типа файла.
Однострочные текстовые значения и CSV
| Ключевое слово | Значение |
|---|---|
IGNORE_MISSING_PATH=<boolean> |
Действие, которое необходимо выполнить, если |
SKIP_HEADER_COUNT=<numlines> |
Количество строк заголовка, которые необходимо пропустить в начале файла перед чтением данных.
Значение по умолчанию — |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
FORMAT <value> |
Формат данных: Обратите внимание, что выражение |
delimiter |
Символ, использующийся в качестве разделителя полей данных.
В формате |
Многострочный текст
| Ключевое слово | Значение |
|---|---|
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
FORMAT |
Для чтения многострочных текстовых данных из NFS требуется указать формат |
Текст фиксированной ширины
| Ключевое слово | Значение |
|---|---|
NEWLINE |
Если значение |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
FORMAT 'CUSTOM' |
Для чтения и записи данных в NFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
<field_name>='<width>' |
Имя и ширина поля данных, указываемая в символах.
Поля должны быть перечислены в порядке их физического следования в файле данных.
Имена полей должны совпадать с именами столбцов в команде При чтении данных, если ширина поля меньше значения |
line_delim |
Указывает символ переноса строки в файле данных, по умолчанию |
Avro
| Ключевое слово | Значение |
|---|---|
COLLECTION_DELIM |
Символы, используемые в качестве разделителя элементов массива, ассоциативного массива или записи верхнего уровня при сопоставлении составного типа данных Avro и текстового столбца во время чтения данных.
По умолчанию используется символ запятой ( |
MAPKEY_DELIM |
Символы, используемые в качестве разделителя ключа и значения элемента ассоциативного массива при сопоставлении составного типа данных Avro и текстового столбца во время чтения данных.
По умолчанию используется символ двоеточия ( |
RECORDKEY_DELIM |
Символы, используемые в качестве разделителя имени и значения поля элемента записи при сопоставлении составного типа данных Avro и текстового столбца во время чтения данных.
По умолчанию используется символ двоеточия ( |
SCHEMA |
Путь к файлу схемы Avro в NFS.
Путь трактуется как относительный к базовому пути, указанному в качестве значения |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
CODEC_LEVEL |
Уровень сжатия (применяется только для кодеков |
FORMAT 'CUSTOM' |
Для чтения и записи данных в NFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
JSON
| Ключевое слово | Значение |
|---|---|
IDENTIFIER=<value> |
Указывается только при обращении к данным JSON с многострочными полями.
Значение Если во вложенном объекте присутствует поле с тем же именем, что указано в качестве |
SPLIT_BY_FILE=<boolean> |
Определяет, как разделять файлы, указанные в |
IGNORE_MISSING_PATH=<boolean> |
Действие, которое необходимо выполнить, если |
ROOT=<value> |
При записи данных в один объект указывает имя атрибута корневого уровня |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: Если кодек сжатия указан, к записанным файлам применяется следующая схема именования: |
FORMAT 'CUSTOM' |
Для чтения и записи данных в NFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
ORC
| Ключевое слово | Значение |
|---|---|
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
MAP_BY_POSITION |
Указывает, должны ли столбцы сопоставляться по их порядку.
Значение по умолчанию — |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: Если сжатия данных не требуется, следует явно указать значение |
FORMAT 'CUSTOM' |
Для чтения и записи данных в NFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
Parquet
| Ключевое слово | Значение |
|---|---|
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: Если сжатия данных не требуется, следует явно указать значение |
ROWGROUP_SIZE |
Размер (в байтах) группы строк, которая обеспечивает логическое разбиение данных на строки. Размер группы строк по умолчанию составляет 8 * 1024 * 1024 байт |
PAGE_SIZE |
Размер (в байтах) страницы, которая делит группы строк в столбце на фрагменты столбцов. Размер страницы по умолчанию составляет 1 * 1024 * 1024 байт |
ENABLE_DICTIONARY |
Указывает, следует ли включать словарное кодирование.
Значение по умолчанию — |
DICTIONARY_PAGE_SIZE |
Когда словарное кодирование включено, для каждого столбца в каждой группе строк определяется единая словарная страница.
Параметр |
PARQUET_VERSION |
Версия Parquet; поддерживаются значения |
SCHEMA |
Путь к файлу схемы Parquet в NFS.
Путь трактуется как относительный к базовому пути, указанному в качестве значения |
FORMAT 'CUSTOM' |
Для чтения и записи данных в NFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |