Модуль прямой загрузки данных QDL
Модуль прямой загрузки данных (Quantum Direct Loader, QDL) - утилита, позволяющая осуществить загрузку из файла формата CSV в таблицу формата QHB согласно конфигурации. Скорость работы существенно превосходит INSERT и COPY за счёт использования оптимизированного многопоточного кода, отсутствия блокировок таблицы и обхода транзакционного ядра.
- Поддерживаемые типы полей
- Синтаксис
- Команда
create_table - Команда
insert_values - Команда
validate - Файл конфигурации
- Сценарий использования
Поддерживаемые типы полей
| Типы | Названия |
|---|---|
| Целочисленные | smallint, int2, integer, int4, int, bigint, int8 |
| Числовые с плавающей запятой | float4, real, float8, double precision |
| Текстовые | character, char, varchar, character varying, text |
| Числа с указанной точностью | decimal, numeric, dec |
| Булевы | bool, boolean |
| Идентификаторы | uuid |
| Временные | timestamp, date |
Примечание.
В текущей версии QDL допускается использование значений NaN (Not a Number) в таких типах данных как float (числовые с плавающей запятой) и numeric (числа с указанной точностью). В дополнение к обычным числовым значениям и NaN, float также имеют специальные значения: Infinity и -Infinity. Обратите внимание, что все значения находящиеся в файле формата CSV не заключаются в кавычки.
Идентификаторы UUID записываются в виде последовательности шестнадцатеричных цифр в нижнем регистре, разделенных знаками минуса на несколько групп, в таком порядке: группа из 8 цифр, за ней три группы из 4 цифр и, наконец, группа из 12 цифр, что в сумме составляет 32 цифры. Пример UUID в этом стандартном виде:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
Временные типы поддерживают такие специальные значения как infinity, -infinity и epoch.
Синтаксис
USAGE:
qdl <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
SUBCOMMANDS:
create_table Generate SQL script to create a table
insert_values Populate a table file with values
validate Validates csv data file
help Prints this message or the help of the given subcommand(s)
Команда create_table
Генерирует SQL-скрипт, создающий таблицу СУБД согласно конфигурации, а также заполняет её первыми тремя кортежами CSV-таблицы. Это требуется для создания структуры таблицы, которая будет заполнена данными. Также это позволяет нам получить пути расположения файлов и их названия(OID, требуемый для генерации командой insert_values).
USAGE:
qdl create_table [FLAGS] [OPTIONS] --config <config>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
-v, --verbose Display debug messages
OPTIONS:
-c, --config <config> Path to config
-d, --data <data> Path to csv file with data
Примечание.
В формате CSV все символы являются значимыми. Значение в таблице, дополненное пробелами или любыми другими символами, кроме DELIMITER, будет включать эти символы. Это может приводить к ошибкам при заполнении таблицы данными из системы, дополняющей строки CSV пробельными символами до некоторой фиксированной ширины. В случае возникновения такой проблемы необходимо обработать файл CSV и удалить из него замыкающие пробельные символы, прежде чем загружать данные из него в QHB.
Пример использования
qdl create_table \
--config config.yml \
--data data.csv
Команда insert_values
Производит загрузку из файла в формате CSV в таблицу формата используемого QHB. Данная команда выполняется многопоточно; количество ядер, отводимое под параллельную обработку, указывается в файле конфигурации.
Также рекомендуется предварительно удостовериться, что версия компоновки страницы QHB равна 4. Сделать это можно, например, при помощи расширения pageinspect::page_header.
USAGE:
qdl insert_values [FLAGS] [OPTIONS] --config <config> --out-dir <out-dir>
FLAGS:
-h, --help Prints help information
-s, --skip-errors Continue adding rows despite errors
-V, --version Prints version information
-v, --verbose Display debug messages
OPTIONS:
-c, --config <config> Path to config
-d, --data <data> Path to csv file with data
-o, --out-dir <out-dir> Output directory
Пример использования
qdl insert_values \
--config config.yml \
--data data.csv \
--out-dir output/
Команда validate
Проверяет логическую целостность CSV-файла и согласованность структуры данных с файлом конфигурации, сигнализируя об ошибках соответствующим кодом возврата. Сообщение об успехе выводится только в случае, если был активирован флаг --verbose, в противном случае выполнение этой команды не сопровождается выводом сообщений в консоль.
USAGE:
qdl validate [FLAGS] [OPTIONS] --config <config>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
-v, --verbose Display debug messages
OPTIONS:
-c, --config <config> Path to config
-d, --data <data> Path to csv file with data
Пример использования
qdl validate \
--config config.yml \
--data data.csv
Файл конфигурации
Файл конфигурации имеет следующие партиции:
- general -- базовая конфигурация приложения. Содержит поля
threads(целочисленное) иchunk_size(целочисленное, опциональное). Первое ответственно за количество потоков-обработчиков сырых данных. Второе ответственно за размер внутреннего буфера передачи данных, данный параметр может меняться с целью оптимизации в нестандартных аппаратных конфигурациях. - input -- конфигурация входных данных. Содержит поля
path(путь),encoding(строковое),delimiter(строковое, опциональное). Первое -- путь до входного файла; второе -- кодировка; третье -- разделитель столбцов для человекочитаемых входных форматов. - output -- конфигурация выходных данных. Содержит поля
segment_size(целочисленное, опциональное) иoid(целочисленное). Первое -- максимальное количество страниц в сегменте БД; второе -- Object IDentifier, который составит часть пути до сегментов. - table -- конфигурация таблицы. Содержит поля
name(строковое) иfields(повторяющиесяfield). Первое -- имя таблицы; второе -- описание каждого из полей(field_1 : varcharи опциональной пометки[nullable]).
Пример конфигурации:
# Конфигурация системы:
general:
# Количество потоков, выделяемых для парсинга и сериализации строк.
# Прошу обратить внимание, что помимо этих потоков обязательно выделяются ещё два:
# поток чтения и поток записи в файл.
threads: 2
# Конфигурация исходных данных:
input:
# Кодировка:
encoding: "utf8"
# Разделитель столбцов для CSV:
delimiter: ";"
# Конфигурация получаемых данных:
output:
# Object IDentifier. Определяет целочисленный идентификатор для группы файлов целевой таблицы.
oid: 16385
# Конфигурация целевой таблицы:
table:
# Имя таблицы. Требуется для `generate_sql`, чтобы задать имя создаваемой таблицы.
name: "t_qdl"
# Колонки в формате "имя": "тип"
fields:
id : integer
social_id : integer [nullable]
first_name : varchar
last_name : varchar
city : varchar (30)
profession : varchar (30) [nullable]
salary : double precision
description : varchar [nullable]
Сценарий использования
ВНИМАНИЕ. Во избежание проблем с правами доступа, все последующие операции требуется производить от имени пользователя, который запускает экземпляр БД.
ШАГ 0(опциональный). qdl validate --config config.yml --data data.csv -- Валидируем CSV файл, проверяем на согласованность с конфигурацией. Это может сэкономить большое количество времени в случаях, когда мы конвертируем CSV-файл большого объёма, т.к. если в ходе работы функции insert_values будет обнаружена ошибка, её выполнение придётся повторить после исправления причин её возникновения.
ШАГ 1. qdl create_table --config config.yml --data data.csv -- Создаём SQL-скрипт создания таблицы, в которую мы хотим загрузить, а в последствии использовать в СУБД. Также этот скрипт получает OID (Object Identifier; потребуется для файла конфигурации insert_values) и пути файлов БД. Эти операции могут быть произведены вручную, но во избежание возможных ошибок рекомендуется использовать скрипт.
ШАГ 2. Исполнение SQL-скрипта. OID, полученный в ходе выполнения, требуется разместить в файле конфигурации config.yml.
ШАГ 3. qdl insert_values --config config.yml --data data.csv --out-dir ./output_dir/ -- Загружаем таблицу - этот процесс может занять значительное время в зависимости от объёма загружаемых данных. Потоки, выполняющие чтение/конвертацию/запись, имеют определённые названия; это позволит системному администратору оценить загруженность каждого отдельно взятого потока\ядра и определить их количеством таким образом, чтобы добиться оптимальной производительности. Также нужно заметить, что внутренние буфера qdl не имеют ограничения размера, а значит при очень медленной записи на диск возможна ситуация, когда эти буфера займут всю оперативную память.
ШАГ 4. Заменяем файлы СУБД сгенерированными при помощи qdl - копируем файлы при помощи команд операционной системы. После этого нам нужно выполнить переподключение БД на вновь сгенерированные файлы, для этого можно выполнить перезагрузку СУБД или выполнить SELECT qhb_drop_rel_cache('table_name');.