# Работа с файлами Apache Parquet

Apache Parquet — это столбчатый формат хранения, очень эффективный для хранения информации и обработки запросов в больших наборах данных. В Qlik Sense можно считывать данные из файлов Parquet и сохранять таблицы как файлы Parquet.

Parquet обеспечивает эффективную обработку запросов в отдельных столбцах таблицы вместо чтения всей таблицы полностью. Это подходит для использования при обработке больших данных. Кроме того, Parquet поддерживает эффективное сжатие и кодирование данных. Это может дополнительно уменьшить пространство, требуемое для хранения, и улучшить эффективность обработки запросов.

## Создание файлов Parquet

Файлы Parquet можно создавать с помощью команды Store в скрипте. Укажите в скрипте, что ранее считанную таблицу или ее часть необходимо экспортировать в явно названный файл в указанном вами местоположении. Хранящиеся данные можно вкладывать в файлы Parquet.

Для получения дополнительной информации см. раздел [Store](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Store.htm).

## Чтение данных из файлов Parquet

Данные из файла Parquet можно считывать так же, как из любого другого файла данных, поддерживаемого Qlik Sense: Это включает Диспетчер данных, редактор загрузки данных или при добавлении данных в новое приложение.

Для получения дополнительной информации см. раздел [Загрузка данных из файлов](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataSource/load-data-from-files.htm).

Также можно загрузить данные из файла Parquet в скрипт загрузки данных с помощью команды LOAD. Например:

```
LOAD  * from [lib://DataFiles/xyz.parquet] (parquet);
```

Для получения дополнительной информации см. раздел [Load](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm).

### Загрузка данных из вложенных файлов Parquet

Если файл Parquet содержит вложенные данные, его необходимо загружать с использованием нескольких операторов load, в каждом из которых указывается, какое подмножество должно загружаться в каждую таблицу. Спецификатор Table is служит для подтверждения пути к узлу группы в схеме для загрузки.

Спецификатор Разделитель ― можно использовать, чтобы указать порядок объединения узлов. Оператор LOAD, загружающий файл с вложенными данными без спецификатора «Разделитель ―», использует значение, заданное в переменной скрипта `FieldNameDelimiter`. Если спецификатор «Разделитель ―» не предоставлен и переменная `FieldNameDelimiter` не задана, то по умолчанию используется разделитель `'.'`.

Загружаются только узлы, соответствующие пути Table is.

Узел данных загружается в файл без вложения.

Узлы группы объединяют поля в группу путем добавления их имени в имя поля. Например, группа с полями field1 и field2 загружаются как group.field1 и group.field2.

Узлы списка будут создавать ключевые поля, используемые для связывания таблиц. Например, %Key\_group.list. Любой узел группы или данных в списке должен загружаться в отдельном операторе load. Также будет загружено ключевое поле в родительском списке.

Следующие примеры показывают тот же вложенный файл Parquet, созданный в примере в [Хранение вложенных данных в файлах Parquet](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Store.htm#Storing), загруженный в приложение, с использованием Диспетчер данных и Редактор загрузки данных (со скриптами по умолчанию из Select data и пользовательскими скриптами).

Пример: Диспетчер данных

Если customer.parquet загружается в Диспетчер данных и применяются все рекомендованные связи, будет создана следующая модель данных:

Модель данных для загрузки company.parquet с помощью Диспетчер данных

Модель данных для загрузки company.parquet с помощью Диспетчер данных

Модель данных для загрузки company.parquetcompany.parquet с помощью Диспетчер данныхДиспетчер данных ![Модель данных, отображающая таблицы company:salesrep.salesrep, company, company:headquarter.headquarter и company:headquarter.headquarter.city:region.region](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_parquet-load-script-dm-dmv.png)

Пример: Редактор загрузки данных (Выбор данных)

Если данные загружаются с помощью экрана Выбор данных в Редактор загрузки данных, будет создан следующий скрипт:

```
LOAD
company,
contact,
"%Key_company:headquarter",
"%Key_company:salesrep"
FROM [lib://DataFiles/company.parquet] (parquet);
			
LOAD
country,
city,
"%Key_city:region",
"%Key_company:headquarter"
FROM [lib://DataFiles/company.parquet] (parquet, table is [company:headquarter.headquarter]);

LOAD
region,
"%Key_city:region"
FROM [lib://DataFiles/company.parquet] (parquet, table is [company:headquarter.headquarter.city:region.region]);

LOAD
salesrep,
"%Key_company:salesrep"
FROM [lib://DataFiles/company.parquet] (parquet, table is [company:salesrep.salesrep]);
```

Модель данных выглядит как в Просмотр модели данных.

Модель данных для загрузки company.parquet с помощью экрана Выбор данных в Редактор загрузки данных

Модель данных для загрузки company.parquet с помощью экрана Выбор данных в Редактор загрузки данных

Модель данных для загрузки company.parquet с помощью экрана Выбор данныхВыбор данных в Редактор загрузки данныхРедактор загрузки данных ![Модель данных, отображающая таблицы salesrep, company, headquarter и region.](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_parquet-load-select-dmv.png)

Пример: Редактор загрузки данных (Пользовательский скрипт загрузки)

Если используется пользовательский скрипт загрузки, имеется больше возможностей для управления тем, какие поля и таблицы загружаются из customer.parquet. Следующий скрипт загружает таблицы и поля из company.parquet:

```
LOAD * FROM [lib://DataFiles/company.parquet] (parquet);
LOAD *, Lookup('company', '%Key_company:salesrepo', [%Key_company:salesrep], 'company') as company;
LOAD * FROM [lib://DataFiles/company.parquet] (parquet, table is [company:salesrep.salesrep]);
DROP FIELD [%Key_company:salesrep];

LOAD *, Lookup('company', '%Key_company:headquarter', [%Key_company:headquarter], 'company') as company;
LOAD * FROM [lib://DataFiles/company.parquet] (parquet, table is [company:headquarter.headquarter]);
DROP FIELD [%Key_company:headquarter];
LOAD *, Lookup('city', '%Key_city:region', [%Key_city:region], 'headquarter') as city;
LOAD * FROM [lib://DataFiles/company.parquet] (parquet, table is [company:headquarter.headquarter.city:region.region]);
DROP FIELD [%Key_city:region]; 
```

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

Модель данных для загрузки company.parquet с помощью пользовательского скрипта Редактор загрузки данных

Модель данных для загрузки company.parquet с помощью пользовательского скрипта Редактор загрузки данных

Модель данных для загрузки company.parquetcompany.parquet с помощью пользовательского скрипта Редактор загрузки данныхРедактор загрузки данных ![Модель данных с таблицами headquarter, region, salesrep и company, которая точно соответствует модели данных из исходного приложения.](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_parquet-load-script-dmv.png)

## Ограничения

В отношении файлов Parquet действуют следующие ограничения:

* Файлы Parquet, содержащие поле метки времени int96, загружаются неправильно.

  Int96 — это устаревший тип данных, содержащий метку времени без данных о часовом поясе. Будет предпринята попытка прочитать поле как UTC, но ее успех нельзя гарантировать, так как имеются разные реализации поставщиков.

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