Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Использование коннектора 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>

Путь к каталогу или файлу в объектном хранилище. Если в конфигурации сервера <server_name> указано свойство pxf.fs.basePath, значение <path_to_data> трактуется как относительный путь к указанному базовому пути. В противном случае путь считается абсолютным. Значение пути не должно содержать символ $

PROFILE=<objstore>:fixedwidth

Профиль указывается в виде пары <objstore>:fixedwidth, где <objstore> — префикс объектного хранилища.

Поддерживаются следующие префиксы <objstore> и соответствующие объектные хранилища:

  • wasbs — Azure Blob Storage

  • adl — Azure Data Lake

  • gs — Google Cloud Storage

  • s3 — Amazon S3, MinIO и прочие S3-совместимые объектные хранилища

FORMAT 'CUSTOM'

Для чтения и записи текста фиксированной ширины в объектном хранилище используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения (fixedwidth_in) и записи (fixedwidth_out)

<field_name>='<width>'

Имя и ширина поля данных, указываемая в символах. Поля должны быть перечислены в порядке их физического следования в файле данных. Имена полей должны совпадать с именами столбцов в команде CREATE EXTERNAL TABLE.

При чтении данных, если ширина поля меньше значения <width>, Greengage DB ожидает, что поле дополнено справа пробелами до требуемой ширины. При записи данных, если ширина поля меньше значения <width>, Greengage DB дополняет поле пробелами справа до требуемой ширины, указанной в <width>

line_delim

Указывает символ переноса строки в файле данных, по умолчанию \n (LF). Если значение указано и содержит \r (CR), \r\n (CRLF) или произвольный набор символов экранирования, требуется также указать NEWLINE, выбрав в качестве значения CR, CRLF или соответствующий набор символов в байтовом формате

DISTRIBUTED BY

При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных

<custom_option>

Одна из опций, описанных ниже, указываемая в строке LOCATION

SERVER=<server_name>

Имя конфигурации сервера, который используется для доступа к данным. Если опция опущена, используется конфигурация сервера с именем default

NEWLINE

Если значение line_delim указано и содержит \r (CR), \r\n (CRLF) или произвольный набор символов экранирования, требуется также указать NEWLINE, выбрав в качестве значения CR, CRLF или соответствующий набор символов в байтовом формате

COMPRESSION_CODEC

Кодек сжатия, используемый при записи данных: default, bzip2, gzip или uncompressed (без сжатия). Если значение не указано (или указано uncompressed), сжатие не производится

IGNORE_MISSING_PATH

Действие, которое необходимо выполнить, если <path_to_data> отсутствует или указан неверно. Если установлено значение false (по умолчанию), возвращается ошибка. Если установлено значение true, PXF игнорирует ошибку и возвращает пустой фрагмент. Применяется только для читающих внешних таблиц; в случае пишущих внешних таблиц игнорируется

Примеры

Эти примеры демонстрируют настройку и использование коннектора PXF object store для чтения и записи текста фиксированной ширины в объектном хранилище с помощью внешних таблиц.

Предварительные требования

Для выполнения практических примеров подключитесь к мастер-хосту Greengage DB как gpadmin с помощью psql, как описано в статье Подключение к Greengage DB с использованием psql. Затем создайте тестовую базу данных customers и подключитесь к ней:

DROP DATABASE IF EXISTS customers;
CREATE DATABASE customers;
\c customers

Чтобы создать внешнюю таблицу с использованием протокола PXF, предварительно зарегистрируйте в БД расширение PXF, как описано в разделе Регистрация PXF в БД документации PXF:

CREATE EXTENSION pxf;

Конфигурирование коннектора PXF S3

Для того чтобы подключиться к объектному хранилищу с помощью PXF, необходимо создать соответствующую конфигурацию сервера, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:

  1. На мастер-хосте Greengage DB войдите под пользователем gpadmin.

  2. Перейдите в каталог $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>

    Учетные данные в файле конфигурации можно указать и в виде обычного текста, но в целях безопасности рекомендуется использовать переменные окружения.

  3. Синхронизируйте конфигурацию между хостами кластера Greengage DB:

    $ pxf cluster sync

Создание читающей внешней таблицы

  1. В бакете 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
  2. На мастер-хосте 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');
  3. Выполните запрос к созданной внешней таблице:

    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)

Создание пишущей внешней таблицы

  1. На мастер-хосте 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');
  2. Вставьте тестовые данные в таблицу 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');
  3. На хосте 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