Таблицы сжатых файлов CONNECT
CONNECT может работать с файлами таблиц, сжатыми в один или несколько файлов zip.
Конкретные параметры, используемые при создании таблиц на основе файлов zip:
| Параметр таблицы | Тип | Описание |
|---|---|---|
| ZIPPED | Булево | Обязательно установить в значение true. |
| ENTRY* | Строка | Необязательное имя или шаблон записи zip или записей zip, используемых с таблицей. Если не указано, будут использоваться все записи или только первая, в зависимости от настройки параметра mulentries. |
| MULENTRIES* | Булево | True, если несколько записей являются частью таблицы. Если не указано, по умолчанию значение false, если параметр entry не указан. Если параметр entry указан, он по умолчанию равен true, если имя записи содержит символы подстановки, или false, если нет. |
| APPEND* | Булево | Используется при создании новых сжатых таблиц (см. ниже) |
| LOAD* | Строка | Используется при создании новых сжатых таблиц (см. ниже) |
Параметры, помеченные знаком «*», должны быть указаны в списке параметров.
Примеры использования:
Пример 1: Единственный CSV-файл, включенный в один ZIP-файл
Предположим, у вас есть CSV-файл, из которого вы хотите создать таблицу:
create table emp ... optional column definition engine=connect table_type=CSV file_name='E:/Data/employee.csv' sep_char=';' header=1;
Если CSV-файл включён в ZIP-файл, CREATE TABLE преобразуется в:
create table empzip ... optional column definition engine=connect table_type=CSV file_name='E:/Data/employee.zip' sep_char=';' header=1 zipped=1 option_list='Entry=emp.csv';
Параметр file_name — имя файла zip. Параметр entry — имя записи внутри файла zip. Если внутри zip-файла содержится только один файл записи, этот параметр можно опустить.
Пример 2: Несколько CSV-файлов, включённых в один ZIP-файл
Если таблица создана из нескольких файлов, таких как emp01.csv, emp02.csv и т. д., стандартное создание таблицы будет следующим:
create table empmul ( ... required column definition ) engine=connect table_type=CSV file_name='E:/Data/emp*.csv' sep_char=';' header=1 multiple=1;
Но если все эти файлы сжаты внутри одного zip-файла, то это будет выглядеть так:
create table empzmul ... required column definition engine=connect table_type=CSV file_name='E:/Data/emp.zip' sep_char=';' header=1 zipped=1 option_list='Entry=emp*.csv';
Здесь параметр entry — шаблон, которому должны соответствовать файлы внутри zip-файла. Если все файлы записей соответствуют, параметр entry можно опустить, но необходимо указать булевый параметр mulentries со значением true.
Пример 3: Один CSV-файл, включённый в несколько ZIP-файлов (без учёта подпапок)
Если таблица создаётся по нескольким zip-файлам, это указывается, как и для всех других многотабличных случаев:
create table zempmul ( ... required column definition ) engine=connect table_type=CSV file_name='E:/Data/emp*.zip' sep_char=';' header=1 multiple=1 zipped=yes option_list='Entry=employee.csv';
Здесь снова параметр entry используется для ограничения файла(ов) записи, используемых внутри zip-файлов, и может быть опущен, если все файлы удовлетворяют требованиям.
Описание столбцов может быть получено с помощью процесса обнаружения для типов таблиц, которые это поддерживают. Это невозможно для нескольких таблиц или нескольких записей.
Таблица каталога может быть создана путём добавления catfunc=columns. Это может быть использовано для отображения определений столбцов для нескольких таблиц. Multiple необходимо установить в false, и определения столбцов будут теми, которые относятся к первой таблице или записи.
В этой первой реализации есть некоторые ограничения:
- Сжатые таблицы являются только для чтения. UPDATE и DELETE не поддерживаются. Однако INSERT поддерживается определённым образом при создании таблиц.
- Внутренние файлы распаковываются в оперативную память. Могут возникнуть проблемы с памятью при работе с большими файлами.
- Для этого подходят только типы файлов, которые можно обработать в памяти. Это включает типы таблиц DOS, FIX, BIN, CSV, FMT, DBF, JSON и XML, а также типы, основанные на них, такие как XCOL, OCCUR и PIVOT.
Оптимизация с помощью индексов или блочных индексов возможна для типов таблиц, которые её поддерживают. Однако она применяется к несжатой таблице. Это означает, что вся таблица всегда распаковывается.
Партиционирование также поддерживается. Узнайте, как это сделать, в разделе о партиционировании.
Создание новых сжатых таблиц
Таблицы могут быть созданы для доступа к уже существующим zip-файлам. Однако также возможно создать zip-файл из существующего файла или таблицы. Существуют два способа создания zip-файла:
Метод insert
insert может быть использован для создания файла таблицы для типов таблиц, основанных на записях (исключая DBF, XML и JSON, когда pretty не равно 0). Однако текущая реализация используемого пакета (minizip) не поддерживает добавление в уже существующую запись zip. Это означает, что при выполнении инструкции insert вставленные записи не добавляются, а заменяют существующие. CONNECT защищает существующие данные, не позволяя выполнять такие операции insert. Поэтому доступны только три способа:
- Использование только одной инструкции insert для создания всей таблицы. Это возможно только для небольших таблиц и в основном полезно при тестировании.
- Создание таблицы из данных другой таблицы. Это можно сделать, выполнив «insert into table select * from another_table» или указав «as select * from another_table» в инструкции create table.
- Создание таблицы из файла, формат которого позволяет использовать инструкцию «load data infile».
Для добавления новой записи в существующий zip-файл укажите «append=YES» в списке параметров. При вставке нескольких записей используйте ALTER для указания необходимых параметров, например:
create table znumul ( Chiffre int(3) not null, Lettre char(16) not null) engine=CONNECT table_type=CSV file_name='C:/Data/FMT/mnum.zip' header=1 lrecl=20 zipped=1 option_list='Entry=Num1'; insert into znumul select * from num1; alter table znumul option_list='Entry=Num2,Append=YES'; insert into znumul select * from num2; alter table znumul option_list='Entry=Num3,Append=YES'; insert into znumul select * from num3; alter table znumul option_list='Entry=Num*,Append=YES'; select * from znumul;
Последний ALTER необходим для отображения всех записей.
Метод сжатия файлов
Этот метод позволяет создать zip-файл из другого файла при создании таблицы. Он применяется ко всем типам таблиц, включая DBF, XML и JSON. Он указывается в инструкции create table с параметром load. Например:
create table XSERVZIP ( NUMERO varchar(4) not null, LIEU varchar(15) not null, CHEF varchar(5) not null, FONCTION varchar(12) not null, NOM varchar(21) not null) engine=CONNECT table_type=XML file_name='E:/Xml/perso.zip' zipped=1 option_list='entry=services,load=E:/Xml/serv2.xml';
При выполнении этой инструкции файл serv2.xml будет сжат как /perso.zip. Имя записи может быть указано или по умолчанию равно имени исходного файла.
Если описания столбцов указаны, таблица может быть использована позже для чтения из сжатой таблицы, но они не используются при создании zip-файла. Таким образом, можно указать фиктивный столбец (должен быть хотя бы один) и создать другую таблицу для чтения zip-файла. Эта таблица может воспользоваться процессом обнаружения, чтобы избежать предоставления описаний столбцов для типов таблиц, которые это поддерживают. Например:
create table mkzq (whatever int) engine=connect table_type=DBF zipped=1 file_name='C:/Data/EAUX/dbf/CQUART.ZIP' option_list='Load=C:/Data/EAUX/dbf/CQUART.DBF'; create table zquart engine=connect table_type=DBF zipped=1 file_name='C:/Data/EAUX/dbf/CQUART.ZIP';
Также возможно создание многозаписной таблицы из нескольких файлов:
CREATE TABLE znewcities ( _id char(5) NOT NULL, city char(16) NOT NULL, lat double(18,6) NOT NULL `FIELD_FORMAT`='loc:[0]', lng double(18,6) NOT NULL `FIELD_FORMAT`='loc:[1]', pop int(6) NOT NULL, state char(2) NOT NULL ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='E:/Json/newcities.zip' ZIPPED=1 LRECL=1000 OPTION_LIST='Load=E:/Json/city_*.json,mulentries=YES,pretty=0';
Здесь файлы для загрузки указываются с символами подстановки, и необходимо указать параметр mulentries. Однако параметр entry не должен быть указан, имена записей будут созданы из имён файлов. Предоставьте фиктивное описание столбцов, если у файлов разное расположение столбцов, но для чтения каждого из них потребуется создать отдельные таблицы.
Тип таблицы ZIP
Доступен также тип таблицы ZIP. Он не предназначен для чтения внутренних файлов, а для отображения информации о содержимом zip-файла. Например:
create table xzipinfo2 ( entry varchar(256)not null, cmpsize bigint not null flag=1, uncsize bigint not null flag=2, method int not null flag=3, date datetime not null flag=4) engine=connect table_type=ZIP file_name='E:/Data/Json/cities.zip';
Это отобразит имя, сжатый размер, несжатый размер и метод сжатия всех записей внутри zip-файла. Имена столбцов не имеют значения; это флаги, которые указывают, какую информацию извлечь.
Возможно извлечение этой информации из нескольких zip-файлов, указав параметр multiple:
create table TestZip1 ( entry varchar(260)not null, cmpsize bigint not null flag=1, uncsize bigint not null flag=2, method int not null flag=3, date datetime not null flag=4, zipname varchar(256) special='FILEID') engine=connect table_type=ZIP multiple=1 file_name='C:/Data/Ziptest/CCAM06300_DBF_PART*.zip';
Здесь мы добавили специальный столбец zipname, чтобы получить имя zip-файла для каждой записи.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-zipped-file-tables/