Использование gpload
Утилита gpload
облегчает загрузку данных в таблицы с помощью параллельного файлового сервера gpfdist (Greenplum Parallel File Server).
Используя спецификацию загрузки, описанную в управляющем YAML-файле, gpload
запускает утилиту gpfdist
, создает внешнюю таблицу на основе исходных данных и запускает операцию INSERT
, UPDATE
или MERGE
для загрузки данных в целевую таблицу БД.
Работа gpload
, включая дополнительные команды SQL, описанные в секции SQL
управляющего YAML-файла, выполняется в рамках одной транзакции.
Это позволяет избежать неконсистентности данных в случаях, когда параллельно выполняются несколько операций загрузки данных в одну таблицу.
Утилиты gpfdist
и gpload
совместимы только с мажорной версией Greengage DB, в комплекте с которой они поставляются (например, 6.x).
Обзор синтаксиса
Синтаксис команды gpload
в общем виде выглядит следующим образом:
gpload -f <control_file> [-l <log_file>] [-h <hostname>] [-p <port>]
[-U <username>] [-d <database>] [-W] [--gpfdist_timeout <seconds>]
[--no_auto_trans] [[-v | -V] [-q]] [-D]
gpload -?
gpload --version
Опция | Описание |
---|---|
-f <control_file> |
YAML-файл, содержащий спецификацию загрузки. Узнайте больше в разделе Управляющий файл |
-d <database> |
База данных, в которую осуществляется загрузка. Если опция не указана, используется имя базы данных из управляющего файла, значение переменной среды |
-h <hostname> |
Имя хоста, на котором запущен мастер-сегмент Greengage DB. Если опция не указана, используется имя хоста из управляющего файла, значение переменной среды |
-p <port> |
TCP-порт, через который осуществляется подключение к мастер-сегменту Greengage DB. Если опция не указана, используется номер порта из управляющего файла, значение переменной среды |
-U <username> |
Имя роли в БД, с помощью которой осуществляется вход в систему. Если опция не указана, используется имя роли из управляющего файла, значения переменной среды |
-W |
Включает принудительный запрос пароля. Если опция не указана, используется пароль из переменной среды |
--gpfdist_timeout <seconds> |
Время ожидания ответа При большой загруженности сети значение может потребоваться увеличить |
--no_auto_trans |
Отключает обработку операции загрузки как одной транзакции в случае, когда в целевую таблицу БД производится одна операция загрузки. По умолчанию каждая операция загрузки данных выполняется в рамках одной транзакции во избежание неконсистентности данных в случаях, когда несколько операций загрузки в одну таблицу выполняются параллельно |
-l <log_file> |
Указывает местоположение лог-файла, по умолчанию ~/gpAdminLogs/gpload_YYYYMMDD. Более подробную информацию о логировании в Greengage DB можно получить в разделе Логирование |
-D |
Запускает утилиту в режиме проверки возможных ошибок, не производя при этом загрузки данных |
-q |
Запускает утилиту в режиме без вывода сообщений. Вывод команды не отображается на экране, но записывается в лог-файл.
Данная опция не может использоваться совместно с |
-v |
Запускает утилиту в режиме подробного вывода сообщений.
Данная опция не может использоваться совместно с |
-V |
Запускает утилиту в режиме очень подробного вывода сообщений.
Данная опция не может использоваться совместно с |
-? |
Выводит справочную информацию и завершает работу утилиты |
--version |
Выводит номер версии утилиты и завершает ее работу |
Управляющий файл
С помощью управляющего файла описывается процесс загрузки.
В управляющем файле указываются параметры подключения к Greengage DB, конфигурация утилиты gpfdist
, настройки внешней таблицы и формат исходных данных.
Файл использует формат YAML 1.1 и собственную схему для описания шагов операции загрузки.
Файл должен быть валидным YAML-документом.
Утилита gpload
обрабатывает содержимое документа в заданном порядке и использует отступы (пробелы) для определения иерархии и взаимосвязей между его разделами.
Пробелы в YAML-документах являются важной частью разметки. Не следует использовать пробелы с целью форматирования, а символы табуляции не следует использовать вообще.
Структура управляющего файла приведена ниже. Полное описание ключей приведено в разделе Описание ключей управляющего файла.
---
VERSION: 1.0.0.1
DATABASE: <db_name>
USER: <db_username>
HOST: <master_hostname>
PORT: <master_port>
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- <hostname_or_ip>
PORT: <http_port>
| PORT_RANGE: [ <start_port_range>, <end_port_range> ]
FILE:
- </path/to/input_file>
SSL: true | false
CERTIFICATES_PATH: </path/to/certificates>
- FULLY_QUALIFIED_DOMAIN_NAME: true | false
- COLUMNS:
- <field_name>: <data_type>
- TRANSFORM: '<transformation>'
- TRANSFORM_CONFIG: '<configuration-file-path>'
- MAX_LINE_LENGTH: <integer>
- FORMAT: text | csv
- DELIMITER: '<delimiter_character>'
- ESCAPE: '<escape_character>' | 'OFF'
- NEWLINE: 'LF' | 'CR' | 'CRLF'
- NULL_AS: '<null_string>'
- FILL_MISSING_FIELDS: true | false
- FORCE_NOT_NULL: <column_name> [, ...]
- QUOTE: '<csv_quote_character>'
- HEADER: true | false
- ENCODING: <database_encoding>
- ERROR_LIMIT: <integer>
- LOG_ERRORS: true | false
EXTERNAL:
- SCHEMA: <schema> | '%'
OUTPUT:
- TABLE: <schema.table_name>
- MODE: insert | update | merge
- MATCH_COLUMNS:
- <target_column_name>
- UPDATE_COLUMNS:
- <target_column_name>
- UPDATE_CONDITION: '<boolean_condition>'
- MAPPING:
<target_column_name>: <source_column_name> | '<expression>'
PRELOAD:
- TRUNCATE: true | false
- REUSE_TABLES: true | false
- STAGING_TABLE: <external_table_name>
- FAST_MATCH: true | false
SQL:
- BEFORE: "<sql_command>"
- AFTER: "<sql_command>"
Операции MERGE
и UPDATE
не поддерживаются, если имя целевой таблицы или колонки является ключевым словом, содержит заглавные буквы или заключено в двойные кавычки (" "
).
Если имена объектов базы данных заключены в двойные кавычки (являются идентификаторами с разделителем), то в управляющем файле gpload
их необходимо указывать внутри одинарных кавычек ('
).
Например, имеется следующая таблица:
CREATE TABLE "MyTable" ("MyColumn" text);
Обращаться к именам таблицы и колонки в управляющем файле необходимо следующим образом:
...
- COLUMNS:
- '"MyColumn"': text
OUTPUT:
- TABLE: public.'"MyTable"'
...
Запуск gpload
-
Создайте управляющий YAML-файл.
-
Запустите утилиту
gpload
, передав в опции-f
созданный управляющий файл, например:$ gpload -f example_load.yml
Примеры
В данных примерах демонстрируется загрузка данных в таблицу БД данными из внешнего файла с помощью методов INSERT
, UPDATE
и MERGE
.
Метод INSERT
В данном примере демонстрируется загрузка данных в таблицу БД методом INSERT
.
-
Очистите таблицу
orders
и заполните ее данными:TRUNCATE TABLE orders; INSERT INTO orders (id, name, price) VALUES (1,'Laptop',999.99), (2,'Smartphone',499.99), (3,'Tablet',299.99);
-
Очистите дополнительную таблицу
audit
:TRUNCATE TABLE audit;
-
В каталоге /tmp мастер-хоста создайте файл orders.csv, содержащий данные для загрузки:
$ cat > orders.csv <<EOF id,name,price 4,Monitor,599.99 5,Keyboard,99.99 EOF
-
На мастер-хосте создайте управляющий файл load.yml:
$ cat > load.yml <<EOF --- VERSION: 1.0.0.1 DATABASE: customers USER: gpadmin HOST: mdw PORT: 5432 GPLOAD: INPUT: - SOURCE: PORT: 8081 FILE: - /tmp/orders.csv - COLUMNS: - id: INTEGER - name: VARCHAR - price: NUMERIC - FORMAT: CSV - HEADER: true OUTPUT: - TABLE: orders - MODE: INSERT SQL: - BEFORE: "INSERT INTO audit VALUES('start', current_timestamp)" - AFTER: "INSERT INTO audit VALUES('end', current_timestamp)" EOF
-
Запустите утилиту
gpload
, передав в опции-f
созданный управляющий файл. В таблицуorders
добавятся новые строки. В таблицуaudit
будут внесены временные метки начала и окончания загрузки.$ gpload -f load.yml
Вывод должен выглядеть следующим образом:
gpload session started INFO|setting schema 'public' for table 'orders' INFO|started gpfdist -p 8000 -P 9000 -f "/tmp/orders.csv" -t 30 INFO|running time: 0.10 seconds INFO|rows Inserted = 2 INFO|rows Updated = 0 INFO|data formatting errors = 0 INFO|gpload succeeded
-
Выполните запрос к таблице
orders
:SELECT * FROM orders;
Вывод должен выглядеть следующим образом, отображая добавленные строки 4 и 5:
id | name | price ----+------------+-------- 1 | Laptop | 999.99 2 | Smartphone | 499.99 3 | Tablet | 299.99 4 | Monitor | 599.99 5 | Keyboard | 99.99
-
Выполните запрос к таблице
audit
:SELECT * FROM audit;
Вывод должен выглядеть следующим образом, отображая временные метки начала и окончания загрузки:
event | timestamp -------+---------------------------- start | 2025-05-25 12:45:47.931476 end | 2025-05-25 12:45:50.134581
Метод UPDATE
В данном примере демонстрируется загрузка данных в таблицу БД методом UPDATE
.
-
Очистите таблицу
orders
и заполните ее данными:TRUNCATE TABLE orders; 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);
-
Очистите дополнительную таблицу
audit
:TRUNCATE TABLE audit;
-
В каталоге /tmp мастер-хоста создайте файл orders.csv, содержащий данные для загрузки. Обратите внимание, что в данных содержатся строки, уже имеющиеся в таблице
orders
, но с отличными значениями в колонкеprice
.$ cat > orders.csv <<EOF id,name,price 1,Laptop,1299.99 4,Monitor,899.99 5,Keyboard,59.99 EOF
-
На мастер-хосте создайте управляющий файл load.yml:
$ cat > load.yml <<EOF --- VERSION: 1.0.0.1 DATABASE: customers USER: gpadmin HOST: mdw PORT: 5432 GPLOAD: INPUT: - SOURCE: FILE: - /tmp/orders.csv - COLUMNS: - id: integer - name: text - price: numeric - FORMAT: CSV - HEADER: true OUTPUT: - TABLE: orders - MODE: UPDATE - MATCH_COLUMNS: - id - UPDATE_COLUMNS: - price SQL: - BEFORE: "INSERT INTO audit VALUES('start', current_timestamp)" - AFTER: "INSERT INTO audit VALUES('end', current_timestamp)" EOF
-
Запустите утилиту
gpload
, передав в опции-f
созданный управляющий файл. Значения в колонкеprice
обновятся в тех строках, где совпадают значения колонкиid
в таблицеorders
и в исходном файле orders.csv. В таблицуaudit
будут внесены временные метки начала и окончания загрузки.$ gpload -f load.yml
Вывод должен выглядеть следующим образом:
INFO|gpload session started INFO|setting schema 'public' for table 'orders' INFO|started gpfdist -p 8000 -P 9000 -f "/tmp/orders.csv" -t 30 INFO|running time: 0.13 seconds INFO|rows Inserted = 0 INFO|rows Updated = 3 INFO|data formatting errors = 0 INFO|gpload succeeded
-
Выполните запрос к таблице
orders
:SELECT * FROM orders;
Вывод должен выглядеть следующим образом, отображая обновленные строки 1, 4 и 5:
id | name | price ----+------------+--------- 1 | Laptop | 1299.99 2 | Smartphone | 499.99 3 | Tablet | 299.99 4 | Monitor | 899.99 5 | Keyboard | 59.99
-
Выполните запрос к таблице
audit
:SELECT * FROM audit;
Вывод должен выглядеть следующим образом, отображая временные метки начала и окончания загрузки:
event | timestamp -------+---------------------------- start | 2025-05-25 16:24:47.931476 end | 2025-05-25 16:24:50.134581
Метод MERGE
В данном примере демонстрируется загрузка данных в таблицу БД методом MERGE
.
-
Очистите таблицу
orders
и заполните ее данными:TRUNCATE TABLE orders; 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);
-
Очистите дополнительную таблицу
audit
:TRUNCATE TABLE audit;
-
В каталоге /tmp мастер-хоста создайте файл orders.csv, содержащий данные для загрузки. Обратите внимание, что в данных содержатся строки, уже имеющиеся в таблице
orders
, но с отличными значениями в колонкеprice
(строки 2, 4 и 5), а также новые строки 6 и 7.$ cat > orders.csv <<EOF id,name,price 1,Laptop,999.99 2,Smartphone,799.99 3,Tablet,299.99 4,Monitor,849.99 5,Keyboard,59.99 6,Webcam,29.99 7,Speakers,129.99 EOF
-
На мастер-хосте создайте управляющий файл load.yml:
$ cat > load.yml <<EOF --- VERSION: 1.0.0.1 DATABASE: customers USER: gpadmin HOST: mdw PORT: 5432 GPLOAD: INPUT: - SOURCE: FILE: - /tmp/orders.csv - COLUMNS: - id: integer - name: text - price: numeric - FORMAT: CSV - HEADER: true OUTPUT: - TABLE: orders - MODE: MERGE - MATCH_COLUMNS: - id - UPDATE_COLUMNS: - price SQL: - BEFORE: "INSERT INTO audit VALUES('start', current_timestamp)" - AFTER: "INSERT INTO audit VALUES('end', current_timestamp)" EOF
-
Запустите утилиту
gpload
, передав в опции-f
созданный управляющий файл. Значения в колонкеprice
обновятся в тех строках, где совпадают значения колонкиid
в таблицеorders
и в исходном файле orders.csv. Если совпадающего значенияid
нет, в таблицу будет вставлена вся строка из файла orders.csv. В таблицуaudit
будут внесены временные метки начала и окончания загрузки.$ gpload -f load.yml
Вывод должен выглядеть следующим образом:
INFO|gpload session started INFO|setting schema 'public' for table 'orders' INFO|started gpfdist -p 8000 -P 9000 -f "/tmp/orders.csv" -t 30 INFO|running time: 0.14 seconds INFO|rows Inserted = 2 INFO|rows Updated = 5 INFO|data formatting errors = 0 INFO|gpload succeeded
-
Выполните запрос к таблице
orders
:SELECT * FROM orders;
Вывод должен выглядеть следующим образом, отображая обновленные строки 2, 4, 5 и добавленные строки 6 и 7:
id | name | price ----+------------+-------- 1 | Laptop | 999.99 2 | Smartphone | 799.99 3 | Tablet | 299.99 4 | Monitor | 849.99 5 | Keyboard | 59.99 6 | Webcam | 29.99 7 | Speakers | 129.99
-
Выполните запрос к таблице
audit
:SELECT * FROM audit;
Вывод должен выглядеть следующим образом, отображая временные метки начала и окончания загрузки:
event | timestamp -------+---------------------------- start | 2025-05-25 15:24:47.931476 end | 2025-05-25 15:24:50.134581
Описание ключей управляющего файла
Ключ | Описание | Обязательность |
---|---|---|
VERSION |
Версия схемы управляющего файла |
Да |
DATABASE <db_name> |
База данных, к которой выполняется подключение. Если значение не указано, по умолчанию применяется значение |
Нет |
USER <db_username> |
Указывает имя роли, с помощью которой выполняется подключение к базе данных. Если значение не указано, по умолчанию используется имя текущего пользователя или применяется значение |
Нет |
HOST <master_hostname> |
Имя мастер-хоста Greengage DB. Если значение не указано, по умолчанию используется |
Нет |
PORT <master_port> |
Порт, прослушиваемый мастер-сервером Greengage DB. Если значение не указано, по умолчанию используется порт |
Нет |
GPLOAD |
Содержит спецификацию загрузки.
Спецификация должна содержать разделы |
Да |
INPUT |
Определяет местоположение и формат исходных данных |
Да |
SOURCE |
Указывает местоположение исходного файла данных. В разделе |
Да |
LOCAL_HOSTNAME <hostname_or_ip> |
Указывает имя хоста или IP-адрес локальной машины, на которой запущен Если на машине настроено несколько сетевых адаптеров (NIC), можно указать имя хоста или IP-адрес каждого отдельного адаптера, чтобы разрешить сетевому трафику использовать их все одновременно. По умолчанию используется только основное имя хоста или IP-адрес локальной машины |
Нет |
PORT <http_port> |
Указывает номер порта, который использует утилита Можно также использовать |
Нет |
PORT_RANGE <start_port_range>, <end_port_range> |
Указывает диапазон портов, из которого утилита |
Нет |
FILE </path/to/input_file> |
Указывает местоположение файла, каталога в локальной файловой системе или именованного канала, содержащего данные для загрузки. Можно указать несколько файлов при условии, что все они используют один и тот же формат данных.
Для указания нескольких файлов можно использовать подстановочные знаки (wildcards), например, |
Да |
SSL true | false |
Указывает, что используется защищенное SSL-соединение. Если указано значение Более подробную информацию можно получить в разделе Настройка SSL |
Нет |
CERTIFICATES_PATH </path/to/certificates> |
Указывает местоположение хранилища сертификатов. Обязателен, если ключу Каталог, указанный в
Корневой каталог ( |
Да, если ключу |
FULLY_QUALIFIED_DOMAIN_NAME true | false |
Указывает способ определения имен хостов в Если указано значение |
Нет |
COLUMNS <field_name>: <data_type> |
Указывает схему файлов данных в формате пары из имени столбца и типа данных ( Символ разделителя ( Это сопоставление по умолчанию можно переопределить с помощью раздела |
Нет |
TRANSFORM '<transformation>' |
Указывает имя трансформации, переданной Более подробную информацию можно получить в разделе Загрузка с помощью gpload |
Нет |
TRANSFORM_CONFIG '<configuration-file-path>' |
Указывает местоположение файла конфигурации трансформации. Более подробную информацию можно получить в разделе Файл конфигурации трансформации |
Да, если указано значение |
MAX_LINE_LENGTH <integer> |
Устанавливает максимальный размер строки данных в байтах, по умолчанию Ключ следует использовать, если в данных содержатся очень длинные строки (или при получении сообщения об ошибке |
Нет |
FORMAT text | csv |
Указывает формат исходных данных: текст ( Более подробную информацию можно получить в статье Форматирование внешних данных |
Нет |
DELIMITER '<delimiter_character>' |
Указывает ASCII-символ, использующийся в качестве разделителя. Разделитель должен располагаться между полями, но не в начале и не в конце строки. Вы также можете указать непечатаемый ASCII-символ или Unicode-символ, например Для текстовых файлов по умолчанию используется знак табуляции ( Для CSV файлов по умолчанию используется знак запятой ( Более подробную информацию можно получить в разделе Форматирование столбцов |
Нет |
ESCAPE '<escape_character>' | 'OFF' |
Указывает символ экранирования. Для текстовых файлов по умолчанию используется знак обратной косой черты ( Для CSV файлов по умолчанию используется знак кавычек ( Более подробную информацию можно получить в разделе Символы экранирования |
Нет |
NEWLINE 'LF' | 'CR' | 'CRLF' |
Указывает символ переноса строки и принимает значения Если значение не указано, используется символ переноса строки, которым заканчивается первая строка файла данных. Более подробную информацию можно получить в разделе Форматирование строк |
Нет |
NULL_AS '<null_string>' |
Указывает строку, обозначающую null-значение — неизвестное значение колонки или поля. Для текстовых файлов по умолчанию используется строка Для CSV файлов по умолчанию используется пустое значение, не заключенное в кавычки. Более подробную информацию можно получить в разделе Обработка NULL-значений |
Нет |
FILL_MISSING_FIELDS true | false |
Устанавливает значения |
Нет |
FORCE_NOT_NULL ( <column_name> [, …] ) |
Позволяет обрабатывать значения полей как заключенные в кавычки. Так как null-значение по умолчанию — пустое значение, не заключенное в кавычки, это позволяет обрабатывать отсутствующие значения как пустые строки |
Нет |
QUOTE '<csv_quote_character>' |
Указывает символ кавычек. По умолчанию используется знак двойных кавычек ( |
Нет |
HEADER true | false |
Указывает на наличие заголовка в файле данных. Если используются несколько файлов с данными, то все они должны иметь заголовок. По умолчанию предполагается, что заголовок в файлах данных отсутствует |
Нет |
ENCODING <database_encoding> |
Определяет кодировку символов исходных данных. Если значение не указано, используется клиентская кодировка по умолчанию. При изменении значения Более подробную информацию можно получить в разделе Кодировка символов |
Нет |
ERROR_LIMIT <integer> |
Включает для данной загрузки режим изоляции ошибок для одной строки. При включении этого режима входные строки данных, содержащие ошибки форматирования, отклоняются до тех пор, пока на любом сегменте Greengage DB не будет превышено пороговое значение количества ошибок. Если порог не достигнут, все корректные строки загружаются, а некорректные — отклоняются либо сохраняются в лог ошибок. По умолчанию операция загрузки прерывается при первой ошибке. Обратите внимание, что изоляция ошибок для одной строки применяется только к строкам данных с ошибками формата, например, лишними или отсутствующими атрибутами, атрибутами с неправильным типом данных или неверной кодировкой. Ошибки ограничений, например, нарушения первичного ключа, все равно приводят к отмене операции загрузки |
Нет |
LOG_ERRORS true | false |
Указывает, сохранять ли в лог информацию об ошибках, если установлено значение Может принимать значения Ошибки форматирования можно просмотреть с помощью встроенной SQL-функции Если для Возвращается только сводная информация об ошибках форматирования.
Вы можете удалить ошибки форматирования из логов ошибок с помощью функции |
Нет |
EXTERNAL |
Указывает схему внешних таблиц, создаваемых По умолчанию используется схема из |
Нет |
SCHEMA <schema> | '%' |
Имя схемы внешней таблицы.
Если схемы с таким именем не найдено, возвращается ошибка.
Если указан символ процента ( Если в имени таблицы не указано схемы, используется схема по умолчанию |
Да, если указано значение |
OUTPUT |
Определяет целевую таблицу и значения колонок для загрузки в БД |
Да |
TABLE <schema.table_name> |
Указывает целевую таблицу для загрузки данных |
Да |
MODE insert | update | merge |
Определяет режим загрузки данных.
Если значение не указано, используется режим Доступны следующие режимы:
|
Нет |
MATCH_COLUMNS <target_column_name> |
Указывает колонки, которые выступают в роли условий объединения для обновления данных. Для того чтобы произошло обновление данных, значения в целевых колонках должны совпадать с соответствующими значениями колонок исходных данных |
Да, если |
UPDATE_COLUMNS <target_column_name> |
Указывает колонки, данные в которых будут обновлены при совпадении значений строк в колонках, указанных в |
Да, если |
UPDATE_CONDITION '<boolean_condition>' |
Указывает логическое условие (подобное используемым в выражении |
Нет |
MAPPING <source_column_name> | '<expression>' |
Переопределяет принцип сопоставления столбцов источника и целевой таблицы. По умолчанию сопоставление происходит по совпадениям имен столбцов источника, указанных в ключе Выражение указывается в виде пар исходных и целевых столбцов ( |
Нет |
PRELOAD |
Указывает операции, выполняемые перед загрузкой данных.
В настоящее время поддерживается только операция |
Нет |
TRUNCATE true | false |
Если установлено значение |
Нет |
REUSE_TABLES true | false |
Если установлено значение Если ключу |
Нет |
STAGING_TABLE <external_table_name> |
Указывает имя временной внешней таблицы, которая создается при работе По умолчанию Если ключу Если ключ Если целевая таблица использует случайное распределение ( |
Нет |
FAST_MATCH true | false |
Если установлено значение |
Нет |
SQL |
Указывает опциональные произвольные команды SQL, которые запускаются перед ( |
Нет |
BEFORE "<sql_command>" |
SQL-команда, запускаемая перед операцией загрузки. Команды следует заключать в кавычки |
Нет |
AFTER "<sql_command>" |
SQL-команда, запускаемая после операции загрузки. Команды следует заключать в кавычки |
Нет |