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

Обзор внешних таблиц

Антон Монаков

Внешние таблицы используются как обычные таблицы Greengage DB (на основе Greenplum), но их данные хранятся за пределами базы данных. С помощью внешних таблиц можно обращаться к внешним данным как к локальным. Как правило, внешние таблицы используются для загрузки данных из внешних источников или выгрузки их во внешние источники.

Внешние таблицы можно использовать в SQL-командах. Например, можно выполнить SELECT для чтения данных из таблицы, JOIN для объединения читающей внешней таблицы с обычной таблицей Greengage DB или INSERT или COPY FROM для записи данных в пишущую таблицу.

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

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

Типы внешних таблиц

Внешние таблицы подразделяются на читающие (readable) и пишущие (writable):

  • Читающие таблицы предназначены для чтения данных из внешних источников, и к ним применимы только операции SELECT.

  • Пишущие таблицы предназначены для записи данных во внешние источники, и к ним применимы только операции INSERT.

В зависимости от используемого источника данных внешние таблицы подразделяются на файловые таблицы и веб-таблицы:

  • Источниками данных файловых таблиц служат статические неструктурированные файлы. Такие таблицы допускают повторное сканирование данных, так как при выполнении запроса данные не меняются.

  • Веб-таблицы используют динамические источники данных, например, обращаясь к веб-серверу по протоколу HTTP или выполняя команды и скрипты. Повторное сканирование в случае веб-таблиц невозможно, так как в ходе выполнения запроса данные могут изменяться. Более подробную информацию о создании веб-таблиц можно получить в разделе Веб-таблицы.

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

Для создания внешней таблицы используйте команду CREATE EXTERNAL TABLE:

CREATE [[READABLE] | WRITABLE] EXTERNAL [WEB] TABLE <table_name>
    (<column_name> <data_type> [, ...] | LIKE <other_table>)
    LOCATION ('<protocol>://<location>)
    | EXECUTE '<command>'
    FORMAT 'TEXT' | 'CSV' | 'CUSTOM'
Основные выражения
Выражение Описание

READABLE | WRITABLE

Определяет тип внешней таблицы: для чтения данных (читающая таблица) или для записи данных (пишущая таблица). Если выражение пропущено, будет создана читающая таблица

WEB

Определяет созданную таблицу как веб-таблицу. Если выражение пропущено, будет создана файловая таблица

LOCATION | EXECUTE

Выражение LOCATION определяет один из поддерживаемых протоколов доступа к данным и местоположение файлов с данными.

Выражение EXECUTE используется при создании читающих веб-таблиц и пишущих таблиц. Оно определяет команду операционной системы (ОС) или скрипт, выполняемый на сегментах

FORMAT

Определяет формат данных: TEXT, CSV или CUSTOM

Более подробную информацию о форматах данных можно получить в статье Форматирование внешних данных

Аргументы
Аргумент Описание

<table_name>

Имя создаваемой таблицы

<column_name>

Имя создаваемого столбца. Обратите внимание, что в отличие от обычных таблиц, в определении внешних таблиц не допускаются ограничения столбцов, а также значения столбцов по умолчанию

<data_type>

Тип данных создаваемого столбца

LIKE <other_table>

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

<protocol>

Протокол, используемый для соединения с источником данных

<location>

Местоположение файла с данными

<command>

Исполняемая команда или скрипт

Поддерживаемые протоколы

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

Встроенные протоколы реализованы внутри Greengage DB и не требуют дополнительной конфигурации. Эти протоколы доступны всегда, и их нельзя отключить.

  • FILE напрямую обращается к файлам данных на сегментах.

  • GPFDIST/GPFDISTS обращается к файлам данных, загружаемым с файловых серверов с помощью утилиты gpfdist.

  • HTTP обращается к файлам данных на веб-серверах.

Подключаемые протоколы позволяют использовать недоступные для FILE, GPFDIST или HTTP источники данных. Эти протоколы необходимо включить и настроить в Greengage DB перед использованием.

  • PXF обращается к объектным хранилищам, системам Hadoop (HDFS, Hive, HBase) и базам данных SQL с помощью Greenplum Platform Extension Framework (PXF).

  • S3 обращается к файлам данных в Amazon S3-совместимых бакетах.

  • CUSTOM обращается к данным через пользовательский механизм, например, задействуя кастомный формат данных или кастомный протокол соединения.

FILE

С помощью протокола FILE можно выполнять чтение одного или нескольких файлов, расположенных на сегмент-хостах Greengage DB. Запись данных не поддерживается, поэтому возможно создание только читающих таблиц.

Чтобы создать внешнюю таблицу, использующую протокол FILE, укажите выражения LOCATION и FORMAT в команде CREATE EXTERNAL TABLE следующим образом:

CREATE EXTERNAL TABLE <table_name>
    (<column_name> <data_type> [, ...] | LIKE <other_table>)
    LOCATION ('file://<segment_host1>[:<port>]/<path>/<file>',
              'file://<segment_host2>[:<port>]/<path>/<file>')
    FORMAT 'TEXT' | 'CSV' | 'CUSTOM';

В выражении LOCATION укажите URI для доступа к файлам: сегмент-хост (<segment_host>), порт (<port>) и путь к файлу (<path>/<file>). Для указания нескольких файлов можно использовать подстановочные знаки (wildcards), например * или []. При чтении автоматически распаковываются файлы с расширениями .gz, .bz2 и .zst.

  • Местоположение каждого файла на сегмент-хосте должно быть доступно пользователю gpadmin. Чтобы убедиться, что указанные URI соответствуют сегмент-хостам и портам, выполните запрос к системной таблице gp_segment_configuration.

    SELECT * FROM gp_segment_configuration;

    Вывод может выглядеть следующим образом:

     dbid | content | role | preferred_role | mode | status | port  | hostname | address |        datadir
    ------+---------+------+----------------+------+--------+-------+-------------+-------------+---------------
        1 |      -1 | p    | p              | n    | u      |  5432 |   mdw    |   mdw   | /data1/master/gpseg-1
        2 |       0 | p    | p              | s    | u      | 10000 |   sdw1   |   sdw1  | /data1/primary/gpseg0
        6 |       0 | m    | m              | s    | u      | 10500 |   sdw2   |   sdw2  | /data1/mirror/gpseg0
        3 |       1 | p    | p              | s    | u      | 10001 |   sdw1   |   sdw1  | /data1/primary/gpseg1
        7 |       1 | m    | m              | s    | u      | 10501 |   sdw2   |   sdw2  | /data1/mirror/gpseg1
        4 |       2 | p    | p              | s    | u      | 10000 |   sdw2   |   sdw2  | /data1/primary/gpseg2
        8 |       2 | m    | m              | s    | u      | 10500 |   sdw1   |   sdw1  | /data1/mirror/gpseg2
        5 |       3 | p    | p              | s    | u      | 10001 |   sdw2   |   sdw2  | /data1/primary/gpseg3
        9 |       3 | m    | m              | s    | u      | 10501 |   sdw1   |   sdw1  | /data1/mirror/gpseg3
       10 |      -1 | m    | m              | s    | u      |  5432 |   smdw   |   smdw  | /data1/master/gpseg-1
  • Вы можете указать несколько URI согласно количеству сегментов, которые будут одновременно задействованы для доступа к внешней таблице. Количество внешних файлов, расположенных на сегмент-хосте, не должно превышать количество сегментов на данном сегмент-хосте. Для того чтобы проверить допустимое количество внешних файлов, выполните запрос к системному представлению pg_max_external_files.

    SELECT * FROM pg_max_external_files;

    В данном примере вывода запроса максимально допустимое количество файлов на сегмент-хосте — два:

    hostname | maxfiles
    ---------+----------
      sdw1   |        2
      sdw2   |        2
    РЕКОМЕНДАЦИЯ

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

В выражении FORMAT укажите формат данных. Более подробную информацию можно получить в статье Форматирование внешних данных.

В данном примере используются два файла CSV, customers-1.csv и customers-2.csv, со следующим содержимым:

id,first_name,last_name,email,phone_number,address
1,John,Doe,john.doe@example.com,123-456-7890,123 Elm Street
2,Jane,Smith,jane.smith@example.com,987-654-3210,456 Oak Street
id,first_name,last_name,email,phone_number,address
3,Bob,Brown,bob.brown@example.com,867-5309-1234,789 Pine Street
4,Rob,Stuart,rob.stuart@example.com,817-4309-6731,119 Willow Street

Файлы находятся в каталоге /tmp на сегмент-хостах sdw1 и sdw2.

  1. На мастер-хосте запустите команду CREATE EXTERNAL TABLE. В выражении FORMAT укажите CSV в качестве формата данных и включите пропуск заголовка (HEADER):

    CREATE EXTERNAL TABLE customers (
            id INTEGER,
            first_name VARCHAR(50),
            last_name VARCHAR(50),
            email VARCHAR(100),
            phone_number VARCHAR(15),
            address VARCHAR(255)
        )
        LOCATION ('file://sdw1:10000/tmp/customers-1.csv',
                'file://sdw2:10000/tmp/customers-2.csv'
        )
        FORMAT 'CSV' (HEADER);
  2. Выполните запрос к созданной таблице:

    SELECT * FROM customers;

    Вывод должен выглядеть следующим образом:

     id | first_name | last_name |         email          | phone_number  |     address
    ----+------------+-----------+------------------------+---------------+------------------
      1 | John       | Doe       | john.doe@example.com   | 123-456-7890  | 123 Elm Street
      2 | Jane       | Smith     | jane.smith@example.com | 987-654-3210  | 456 Oak Street
      3 | Bob        | Brown     | bob.brown@example.com  | 867-5309-1234 | 789 Pine Street
      4 | Rob        | Stuart    | rob.stuart@example.com | 817-4309-6731 | 119 Willow Street

GPFDIST/GPFDISTS

С помощью протокола GPFDIST можно обращаться к файлам данных, загружаемым с файловых серверов с помощью утилиты gpfdist. Протокол GPFDISTS дополнительно позволяет использовать защищенное SSL-соединение между Greengage DB и файловым сервером.

С более подробной информацией и примерами можно ознакомиться в статье Использование gpfdist.

PXF

С помощью протокола PXF (Greenplum Platform Extension Framework) можно получать данные из объектных хранилищ (Azure, Google Cloud Storage, Minio, S3), систем Hadoop (HDFS, Hive, HBase) и баз данных SQL, а также записывать данные в текстовом, бинарном и Parquet форматах.

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

S3

С помощью протокола S3 можно обращаться к файлам, хранящимся в S3-бакетах, и создавать читающие и пишущие таблицы.

Перед использованием протокола S3 необходимо зарегистрировать его в Greengage DB и создать конфигурационный файл.

  1. Подключитесь к базе данных, в которой планируется использовать протокол S3:

    $ psql <database>
  2. Создайте функции чтения и записи данных для библиотеки протокола S3:

    CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
    '$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
    CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
    '$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
  3. Объявите протокол S3, указав созданные функции чтения и записи данных.

    • Чтобы разрешить доступ к протоколу только суперпользователю Greengage DB (gpadmin):

      CREATE PROTOCOL s3 (writefunc = write_to_s3, readfunc = read_from_s3);
    • Чтобы разрешить доступ к протоколу обычным пользователям, создайте его как доверенный (TRUSTED) протокол и выдайте пользователям соответствующие привилегии с помощью команды GRANT. Более подробную информацию об управлении доступом в Greengage DB можно получить в статье Роли и привилегии.

      CREATE TRUSTED PROTOCOL s3 (writefunc = write_to_s3, readfunc = read_from_s3);
      GRANT ALL ON PROTOCOL s3 TO user1, user2;
  1. Запустите утилиту gpcheckcloud, чтобы сгенерировать шаблон конфигурационного файла:

    $ gpcheckcloud -t > ./s3.conf
  2. Отредактируйте файл, если это необходимо:

    $ vi s3.conf

    Укажите требуемые значения:

    [default]
    secret = "<secret_access_key>"
    accessid = "<access_key_id>"
    threadnum = 4
    chunksize = 67108864
    low_speed_limit = 10240
    low_speed_time = 60
    encryption = true
    version = 2
    proxy = ""
    autocompress = true
    verifycert = true
    server_side_encryption = ""
    # gpcheckcloud config
    gpcheckcloud_newline = "\n"
    ВАЖНО

    Набор ожидаемых значений может варьироваться в зависимости от требований поставщика услуг. Например, если для параметра version установлено значение 1, то в выражении LOCATION команды CREATE EXTERNAL TABLE указывается URL сервиса Amazon S3, а опция region не используется. Если же для параметра version установлено значение 2, то в выражении LOCATION указывается URL S3-совместимого сервиса и требуется использование опции region.

  3. Проверьте возможность соединения с помощью утилиты gpcheckcloud. Обратите внимание, что в нижеприведенном примере используется опции region, так как для параметра version в конфигурационном файле установлено значение 2:

    $ gpcheckcloud -c "s3://example.company.com/<bucket_name>/[<S3_prefix>] \
        config=/path/to/s3.config \
        region=<S3_data_source_region>"

    Вывод должен выглядеть следующим образом:

    ...
    File: data//info.txt, Size: 378
    File: data//orders.csv, Size: 1080
    File: data//test.txt, Size: 550
    
    Your configuration works well.
  4. Сохраните конфигурационный файл s3.conf в любом удобном месте.

    По умолчанию, ожидаемое расположения файла — подкаталог s3 внутри каталога данных на каждом сегменте (например, /data1/primary/gpseg0/s3). Конфигурацию можно упростить, сохранив файл в одинаковый для всех сегмент-хостов каталог, например, /tmp/s3. В качестве альтернативы можно также использовать HTTP/HTTPS-сервер, предоставляющий конфигурационный файл всем сегмент-хостам.

Для создания внешней таблицы с помощью протокола S3 в команде CREATE EXTERNAL TABLE используйте выражения LOCATION и FORMAT следующим образом:

CREATE EXTERNAL TABLE <table_name>
    (<column_name> <data_type> [, ...] | LIKE <other_table>)
    LOCATION ('s3://<S3_endpoint>[:<port>]/<bucket_name>/[<S3_prefix>]
        [region=<S3_region>]
        [config=<config_file_location> | config_server=<url>]
        [section=<section_name>]')
    FORMAT 'TEXT' | 'CSV' | 'CUSTOM';

В выражении LOCATION укажите S3-эндпойнт (<S3_endpoint>), порт (<port>) и имя бакета (<bucket_name>). Указанное местоположение S3 должно быть доступно всем сегмент-хостам.

  • Используйте параметр <S3_prefix> для установки префикса имен файлов. Префикс служит для выбора файлов при создании читающей таблицы и добавляется к имени создаваемых файлов при создании пишущей таблицы.

  • Установите значения региона S3 (<S3_region>), местоположения конфигурационного файла (<config_file_location>) или URL конфигурационного веб-сервера (<url>), также используемого раздела конфигурационного файла (<section_name>) согласно вашей конфигурации S3.

Во время чтения данных происходит автоматическая распаковка файлов .gz и .deflate. Во время записи данных происходит упаковка файлов .gz, если параметр autocompress конфигурационного файла S3 не указан или для него установлено значение true.

В выражении FORMAT укажите формат данных. Выбранный формат (TEXT или CSV) определяет расширение создаваемых файлов (.txt или .csv). Более подробную информацию можно получить в статье Форматирование внешних данных.

В данном примере используются два файла, orders-1.csv и orders-2.csv, расположенные в бакете customers S3-хранилища storage.example.com. Файлы имеют следующее содержимое:

id,name,price
1,Laptop,999.99
2,Smartphone,499.99
3,Tablet,299.99
id,name,price
4,Monitor,599.99
5,Keyboard,99.99
  1. На мастер-хосте запустите команду CREATE EXTERNAL TABLE. В выражении LOCATION вместо имени файла укажите префикс имени файла orders, чтобы выбрать оба файла. В выражении FORMAT укажите CSV в качестве формата данных и включите пропуск заголовка (HEADER):

    CREATE EXTERNAL TABLE orders (
            id INTEGER,
            name VARCHAR,
            price NUMERIC
        )
        LOCATION ('s3://storage.example.com/customers/orders
            region=ru-central1
            config=/home/gpadmin/s3.conf'
        )
        FORMAT 'CSV' (HEADER);
  2. Выполните запрос к созданной таблице:

    SELECT * FROM orders;

    Вывод запроса будет содержать данные из файла:

     id |    name    | price
    ----+------------+--------
      1 | Laptop     | 999.99
      2 | Smartphone | 499.99
      3 | Tablet     | 299.99
      4 | Monitor    | 599.99
      5 | Keyboard   |  99.99

В данном примере создается пишущая таблица orders, содержимое которой будет выгружено в CSV файл. Файл будет создан автоматически в бакете customers S3-хранилища storage.example.com.

  1. На мастер-хосте запустите команду CREATE WRITABLE EXTERNAL TABLE. В выражении LOCATION вместо имени файла укажите префикс имени файла orders. В выражении FORMAT укажите CSV в качестве формата данных созданного CSV файла:

    CREATE WRITABLE EXTERNAL TABLE orders (
            id INTEGER,
            name VARCHAR,
            price NUMERIC
        )
        LOCATION ('s3://storage.example.com/customers/orders
            region=ru-central1
            config=/home/gpadmin/s3.conf'
        )
        FORMAT 'CSV';
  2. Вставьте данные в созданную таблицу:

    INSERT INTO orders (id, name, price)
    VALUES (1,'Laptop',999.99),
           (2,'Smartphone',499.99),
           (3,'Tablet',299.99);
  3. Распакуйте файл orders.csv1d6c93761.csv.gz, созданный в S3-бакете и проверьте его содержимое:

    $ gzip -dk orders1d6c93761.csv.gz && cat orders1d6c93761.csv

    Содержимое должно выглядеть следующим образом:

    1,Laptop,999.99
    2,Smartphone,499.99
    3,Tablet,299.99

CUSTOM

С помощью протокола CUSTOM можно получать данные из источников, недоступных остальным протоколам. К примеру, вы можете напрямую передавать поток данных из Greengage DB в целевую систему, не используя при этом промежуточные механизмы (например, gpfdist).

Для создания CUSTOM-протокола требуется реализовать ряд C-функций с заданными интерфейсами, объявить их в Greengage DB, включить протокол в базе данных и выдать пользователям привилегии на использование протокола.

Веб-таблицы

С помощью внешних веб-таблиц можно работать с динамическими источниками данных как с локальными данными. В ходе выполнения запроса данные могут изменяться, поэтому повторное сканирование в случае веб-таблиц невозможно.

  • Таблицы на основе URL получают данные с веб-серверов по протоколу HTTP. Такие таблицы могут бы только читающими.

  • Таблицы на основе команд получают данные путем запуска команд операционной системы (ОС) и скриптов или передают данные на вход командам и скриптам. Такие таблицы могут бы как читающими, так и пишущими.

Для создания внешней веб-таблицы используйте команду CREATE EXTERNAL WEB TABLE. В одной команде CREATE EXTERNAL WEB TABLE не допускается смешивание выражений создания таблиц на основе URL и на основе команд.

Таблицы на основе URL

С помощью таблиц на основе URL можно получать данные с веб-сервера по протоколу HTTP.

Для создания внешней таблицы с помощью протокола HTTP в команде CREATE EXTERNAL WEB TABLE используйте выражения LOCATION и FORMAT следующим образом:

CREATE EXTERNAL WEB TABLE <table_name>
    (<column_name> <data_type> [, ...] | LIKE <other_table>)
    LOCATION ('http://<webhost>[:<port>]/<path>/<file>')
    FORMAT 'TEXT' | 'CSV' | 'CUSTOM';

В выражении LOCATION укажите URI для доступа к файлам: имя веб-сервера (<webhost>), порт (<port>) и путь к файлу (<path>/<file>). Указанный веб-сервер должен быть доступен всем сегмент-хостам. Вы можете указать несколько URI согласно количеству сегментов, которые будут одновременно задействованы для доступа к веб-серверу. Для указания нескольких файлов можно использовать подстановочные знаки (wildcards), например * или [].

В выражении FORMAT укажите формат данных. Более подробную информацию можно получить в статье Форматирование внешних данных.

В данном примере используется файл customers.csv, загружаемый с веб-сервера web.storage.com. Файл имеет следующее содержимое:

id,first_name,last_name,email
1,Bob,Brown,bob.brown@example.com
2,Rob,Stuart,rob.stuart@example.com
  1. На мастер-хосте запустите команду CREATE EXTERNAL WEB TABLE. В выражении FORMAT укажите CSV в качестве формата данных и включите пропуск заголовка (HEADER):

    CREATE EXTERNAL WEB TABLE customers (
            id INTEGER,
            first_name VARCHAR(50),
            last_name VARCHAR(50),
        )
        LOCATION ('http://web.storage.com:8000/customers.csv')
        FORMAT 'CSV' ( HEADER );
  2. Выполните запрос к созданной таблице:

    SELECT * FROM customers;

    Вывод запроса будет содержать данные из файла:

    id | first_name | last_name |         email
    ---+------------+-----------+------------------------
     1 | Bob        | Brown     | bob.brown@example.com
     2 | Rob        | Stuart    | rob.stuart@example.com

Таблицы на основе команд

С помощью таблиц на основе команд можно получать или передавать данные путем запуска на сегментах команд ОС и скриптов.

Для создания внешней таблицы на основе команд в команде CREATE EXTERNAL WEB TABLE используйте выражения LOCATION и FORMAT следующим образом:

CREATE [[READABLE] | WRITABLE] EXTERNAL WEB TABLE <table_name>
    (<column_name> <data_type> [, ...] | LIKE <other_table>)
    EXECUTE '<command>'
    FORMAT 'TEXT' | 'CSV' | 'CUSTOM';

В выражении EXECUTE укажите команду или скрипт для запуска (<command>). Скрипты должны быть запускаемыми от имени суперпользователя (gpadmin), и их местоположение на мастер-хосте и сегмент-хостах должно быть одинаковым. По умолчанию команды запускаются на каждом сегменте каждого сегмент-хоста, но с помощью опционального выражения ON вы можете указать, на каких конкретно сегментах должен производиться запуск.

В выражении FORMAT укажите формат данных. Более подробную информацию можно получить в статье Форматирование внешних данных.

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

ПРИМЕЧАНИЕ

Запуск указанной команды или скрипта осуществляется из базы данных, поэтому переменные среды, перечисленные в .bashrc или .profile, недоступны. Переменные среды должны передаваться внутри выражения EXECUTE, например:

CREATE [[READABLE] | WRITABLE] EXTERNAL WEB TABLE <table_name> ( ... )
    EXECUTE 'PATH=/home/gpadmin/programs; export PATH; script.sh'
    FORMAT 'TEXT';

В данном примере используется скрипт loader.sh, который выводит случайное число. Скрипт имеет следующее содержимое:

#!/bin/bash

# Output random number
echo $((1 + $RANDOM % 10))

Скрипт располагается в каталоге /home/gpadmin/programs на каждом из двух сегментов двух сегмент-хостов.

  1. На мастер-хосте запустите команду CREATE EXTERNAL WEB TABLE для создания внешней таблицы на основе скрипта loader.sh. В выражении FORMAT укажите TEXT в качестве формата данных:

    CREATE EXTERNAL WEB TABLE log (number INTEGER)
        EXECUTE 'PATH=/home/gpadmin/programs; export PATH; loader.sh'
        FORMAT 'TEXT';
  2. Выполните запрос к созданной таблице:

    SELECT * FROM log;

    Вывод должен выглядеть следующим образом:

     number
    --------
          3
          6
          6
         10

В данном примере используется команда cat, которая выгружает входные данные в файл output.txt, расположенный в каталоге /tmp. Команда будет запущена на каждом из двух сегментов двух сегмент-хостов.

  1. На мастер-хосте запустите команду CREATE EXTERNAL WEB TABLE. В выражении EXECUTE укажите команду cat. Чтобы добавить к имени созданного файла ID сегмента, выполняющего команду, используйте переменную среды GP_SEGMENT_ID.
    В выражении FORMAT укажите CSV в качестве формата данных:

    CREATE WRITABLE EXTERNAL WEB TABLE orders (
            id INTEGER,
            name VARCHAR,
            price NUMERIC
        )
        EXECUTE 'cat > /tmp/output_$GP_SEGMENT_ID.csv'
        FORMAT 'CSV';
  2. Вставьте данные в созданную таблицу:

    INSERT INTO orders (id, name, price)
    VALUES (1,'Laptop',999.99),
           (2,'Smartphone',499.99),
           (3,'Tablet',299.99),
           (4,'Monitor',599.99),
           (5,'Keyboard',99.99);
  3. Команда cat выполнится на каждом из двух сегментов двух сегмент-хостов. В результате выполнения в каталоге /tmp на каждом сегмент-хосте будут созданы файлы output_*.csv. Проверьте содержимое созданных файлов:

    $ cat /tmp/output_*.csv

    Содержимое должно выглядеть следующим образом:

    1,Laptop,999.99
    2,Smartphone,499.99
    3,Tablet,299.99
    4,Monitor,599.99
    5,Keyboard,99.99