Spec-Zone.ru › DuckDB

Форматы файлов

Обработка файлов Parquet

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

Причины запроса файлов Parquet

Доступность основных статистик: Файлы Parquet используют столбцовый формат хранения и содержат основные статистические данные, такие как zonemaps. Благодаря этим функциям DuckDB может использовать оптимизации, такие как проекция и сжатие фильтров на файлы Parquet. Поэтому рабочие нагрузки, которые сочетают проекцию, фильтрацию и агрегацию, как правило, хорошо работают с файлами Parquet.

Учёт хранения: Загрузка данных из файлов Parquet потребует примерно того же объёма места для файла базы данных DuckDB. Поэтому, если доступное дисковое пространство ограничено, целесообразно выполнять запросы непосредственно к файлам Parquet.

Причины не запроса файлов Parquet

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

Совет. Если вы обнаружите, что DuckDB генерирует неэффективный порядок объединения для файлов Parquet, попробуйте загрузить файлы Parquet в таблицы DuckDB. Улучшенные статистические данные, вероятно, помогут получить лучший порядок объединения.

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

Высокие времена декомпрессии: Некоторые файлы Parquet сжимаются с помощью алгоритмов сжатия, таких как gzip. В этих случаях запрос к файлам Parquet потребует затратного времени декомпрессии каждый раз при обращении к файлу. Между тем, методы сжатия, такие как Snappy, LZ4 и zstd, быстрее декомпрессируются. Вы можете использовать parquet_metadata функцию, чтобы узнать используемый алгоритм сжатия.

Микробенчмарк: Запуск TPC-H на базе данных DuckDB по сравнению с Parquet

Запросы к бенчмарку TPC-H выполняются примерно в 1,1-5,0 раз медленнее на файлах Parquet, чем на базе данных DuckDB.

Рекомендация по наилучшим практикам Если у вас есть доступное дисковое пространство, у вас есть рабочая нагрузка с большим количеством объединений и/или вы планируете выполнить много запросов на одном наборе данных, сначала загрузите файлы Parquet в базу данных. Алгоритм сжатия и размер групп строк в файлах Parquet сильно влияют на производительность: изучите эти параметры с помощью parquet_metadata функции.

Влияние размера групп строк

DuckDB лучше всего работает с файлами Parquet, содержащими группы строк размером от 100 000 до 1 000 000 строк. Причина в том, что DuckDB может только параллелизоваться по группам строк – поэтому если файл Parquet содержит одну гигантскую группу строк, она может обрабатываться только одним потоком. Вы можете использовать parquet_metadata функцию, чтобы узнать, сколько групп строк содержит файл Parquet. При записи файлов Parquet используйте row_group_size параметр.

Микробенчмарк: Выполнение запроса агрегации с различными размерами групп строк

Мы выполняем простой запрос агрегации по файлам Parquet с использованием различных размеров групп строк, выбранных в диапазоне от 960 до 1 966 080. Результаты следующие.

Размер группы строк Время выполнения
960 8,77 с
1920 8,95 с
3840 4,33 с
7680 2,35 с
15360 1,58 с
30720 1,17 с
61440 0,94 с
122880 0,87 с
245760 0,93 с
491520 0,95 с
983040 0,97 с
1966080 0,88 с

Результаты показывают, что размеры групп строк <5000 оказывают сильное негативное влияние, увеличивая время выполнения более чем в 5-10 раз по сравнению с оптимальными размерами групп строк, в то время как размеры групп строк между 5000 и 20000 по-прежнему хуже на 1,5-2,5 раза по сравнению с наилучшей производительностью. При размерах групп строк более 100 000 различия незначительны: разница между лучшим и худшим временем выполнения составляет около 10%.

Размеры файлов Parquet

DuckDB также может параллельно обрабатывать несколько файлов Parquet. Желательно иметь как минимум столько общих групп строк по всем файлам, сколько процессорных потоков. Например, на машине с 10 потоками, как 10 файлов по 1 группе строк, так и 1 файл с 10 группами строк обеспечат полную параллельность. Также полезно поддерживать умеренные размеры отдельных файлов Parquet.

Рекомендация по наилучшим практикам Идеальный диапазон составляет от 100 МБ до 10 ГБ на один файл Parquet.

Разбиение Hive для сжатия фильтров

При запросе к множеству файлов с условиями фильтрации производительность можно повысить, используя структуру папок в формате Hive для разбиения данных по столбцам, используемым в условии фильтра. DuckDB будет считывать только папки и файлы, которые соответствуют критериям фильтра. Это особенно полезно при запросе к удалённым файлам.

Дополнительные советы по чтению и записи файлов Parquet

Дополнительные советы по чтению и записи файлов Parquet см. на странице Советы по работе с Parquet.

Загрузка файлов CSV

CSV-файлы часто распространяются в сжатом формате, например, в архивах GZIP (.csv.gz). DuckDB может декомпрессировать эти файлы на лету. Фактически, это, как правило, быстрее, чем сначала декомпрессировать файлы и затем загружать их из-за сокращения ввода-вывода.

Схема Время загрузки
Загрузка из сжатых в формате GZIP CSV-файлов (.csv.gz) 107,1 с
Декомпрессия (с использованием параллельной gunzip) и загрузка из декомпрессированных CSV-файлов 121,3 с

Загрузка многих небольших CSV-файлов

Чтение CSV-файлов выполняет анализатор CSV для всех файлов. Для многих небольших файлов это может вызвать излишне высокую нагрузку. Возможная оптимизация для ускорения этого процесса заключается в отключении анализатора. Предполагая, что все файлы имеют одинаковый диалект CSV и имена/типы столбцов, получите параметры анализатора следующим образом:

.mode line
SELECT Prompt FROM sniff_csv('part-0001.csv');
Prompt = FROM read_csv('file_path.csv', auto_detect=false, delim=',', quote='"', escape='"', new_line='\n', skip=0, header=true, columns={'hello': 'BIGINT', 'world': 'VARCHAR'});

Затем вы можете настроить read_csv команду, например, применив расширение имён файлов (глоббинг), и запустить её с остальными параметрами, обнаруженными анализатором:

FROM read_csv('part-*.csv', auto_detect=false, delim=',', quote='"', escape='"', new_line='\n', skip=0, header=true, columns={'hello': 'BIGINT', 'world': 'VARCHAR'});

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/guides/performance/file_formats.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API