Обзор внешних таблиц
Внешние таблицы используются как обычные таблицы Greengage DB (на основе Greenplum), но их данные хранятся за пределами базы данных. С помощью внешних таблиц можно обращаться к внешним данным как к локальным. Как правило, внешние таблицы используются для загрузки данных из внешних источников или выгрузки их во внешние источники.
Внешние таблицы можно использовать в SQL-командах.
Например, можно выполнить SELECT
для чтения данных из таблицы, JOIN
для объединения читающей внешней таблицы с обычной таблицей Greengage DB или INSERT
или COPY FROM
для записи данных в пишущую таблицу.
Типы внешних таблиц
Внешние таблицы подразделяются на читающие (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 |
Выражение Выражение |
FORMAT |
Определяет формат данных: Более подробную информацию о форматах данных можно получить в статье Форматирование внешних данных |
Аргумент | Описание |
---|---|
<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.
-
На мастер-хосте запустите команду
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);
-
Выполните запрос к созданной таблице:
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 и создать конфигурационный файл.
-
Подключитесь к базе данных, в которой планируется использовать протокол S3:
$ psql <database>
-
Создайте функции чтения и записи данных для библиотеки протокола 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;
-
Объявите протокол 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;
-
-
Запустите утилиту
gpcheckcloud
, чтобы сгенерировать шаблон конфигурационного файла:$ gpcheckcloud -t > ./s3.conf
-
Отредактируйте файл, если это необходимо:
$ 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
. -
Проверьте возможность соединения с помощью утилиты
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.
-
Сохраните конфигурационный файл 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
-
На мастер-хосте запустите команду
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);
-
Выполните запрос к созданной таблице:
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.
-
На мастер-хосте запустите команду
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';
-
Вставьте данные в созданную таблицу:
INSERT INTO orders (id, name, price) VALUES (1,'Laptop',999.99), (2,'Smartphone',499.99), (3,'Tablet',299.99);
-
Распакуйте файл 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
-
На мастер-хосте запустите команду
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 );
-
Выполните запрос к созданной таблице:
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 на каждом из двух сегментов двух сегмент-хостов.
-
На мастер-хосте запустите команду
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';
-
Выполните запрос к созданной таблице:
SELECT * FROM log;
Вывод должен выглядеть следующим образом:
number -------- 3 6 6 10
В данном примере используется команда cat
, которая выгружает входные данные в файл output.txt, расположенный в каталоге /tmp.
Команда будет запущена на каждом из двух сегментов двух сегмент-хостов.
-
На мастер-хосте запустите команду
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';
-
Вставьте данные в созданную таблицу:
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);
-
Команда
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