Parquet
Parquet — это формат хранения данных в столбцовом (колоночном) представлении, разработанный для эффективного сжатия, кодирования и обработки больших объёмов структурированных и полуструктурированных данных. Parquet относится к классу открытых форматов файлов, оптимизированных для аналитических нагрузок в экосистеме больших данных (Big Data). Основные характеристики: высокая степень сжатия, поддержка сложных вложенных структур, совместимость с большинством фреймворков обработки данных (Apache Hadoop, Apache Spark, Apache Hive, Apache Impala, Apache Flink, Pandas, Dask) и облачных хранилищ (Amazon S3, Google Cloud Storage, Azure Blob Storage).
История
Формат Parquet был создан совместными усилиями компаний Twitter и Cloudera в 2013 году как проект с открытым исходным кодом. Разработка велась в рамках сообщества Apache Software Foundation. Первая стабильная версия (1.0) была выпущена в марте 2013 года. Основная мотивация создания Parquet — преодоление ограничений строковых форматов (CSV, JSON, Avro) при выполнении аналитических запросов, где требуется чтение только отдельных колонок. В 2015 году проект стал частью инкубатора Apache, а в 2017 году получил статус «Top-Level Project» Фонда Apache. С тех пор Parquet является одним из стандартов де-факто в области хранения данных для аналитики.
Архитектура и принципы работы
Parquet использует колоночное хранение: данные упорядочены не по строкам, а по столбцам. Это позволяет при выполнении запроса считывать только необходимые колонки, а не все поля записи, что существенно сокращает объём ввода-вывода (I/O). Формат поддерживает несколько уровней организации:
Физическая структура файла
- Файл Parquet состоит из одной или нескольких строковых групп (Row Groups). Каждая строковая группа содержит логический набор строк, разбитый по колонкам.
- Колонка внутри строковой группы хранится в виде непрерывного блока данных (Column Chunk).
- Страницы (Pages) — минимальные единицы сжатия и чтения. Каждый колоночный блок делится на страницы (обычно 1–8 МБ). Страницы бывают трёх типов: страницы данных, страницы индексов и словарные страницы.
Метаданные и схема
В Parquet метаданные хранятся в конце файла (footer). Метаданные содержат:
- Схему данных (имена колонок, типы данных, вложенность).
- Информацию о количестве строк, размерах блоков, используемых сжатии и кодировании.
- Статистику по каждой колонке (минимум, максимум, количество нулей) — это позволяет пропускать целые группы строк при фильтрации (predicate pushdown).
Кодирование и сжатие
Parquet поддерживает несколько методов кодирования для разных типов данных:
- Plain — без кодирования, данные хранятся как есть.
- Dictionary Encoding — построение словаря уникальных значений для колонки с небольшим количеством уникальных записей. Значения заменяются индексами из словаря. Эффективно для данных с высокой избыточностью.
- Bit Packing — упаковка целых чисел в минимальное количество бит.
- Run-Length Encoding (RLE) — кодирование повторяющихся значений последовательностями «длина-значение». Применяется к булевым, перечислимым и дельта-закодированным данным.
- Delta Encoding — сохранение разностей между последовательными значениями, что уменьшает битовую ширину.
Сжатие выполняется на уровне страниц по выбору пользователя. Поддерживаются алгоритмы: Snappy, Gzip, LZO, Brotli, LZ4, Zstd. Наиболее распространён — Snappy как компромисс между скоростью и степенью сжатия.
Вложенные структуры
Parquet поддерживает сложные типы данных (массивы, структуры, карты) с помощью модели «Dremel», разработанной в Google. Модель основана на концепции повторения (repetition) и определения (definition) уровней для каждого поля. Это позволяет хранить произвольно вложенные JSON-подобные объекты без потери информации и без избыточности.
Сравнение с другими форматами
| Характеристика | Parquet (колоночный) | Avro (строковый) | ORC (колоночный) | CSV/JSON (строковый) |
|---|---|---|---|---|
| Оптимизация для чтения | Только нужные колонки | Все строки целиком | Только нужные колонки | Все строки целиком |
| Сжатие | Высокое за счёт словарей и страниц | Умеренное (по записям) | Очень высокое (встроенные индексы) | Низкое (текстовый) |
| Скорость записи | Средняя (требуется статистика) | Высокая | Средняя | Высокая |
| Поддержка вложенных структур | Полная (модель Dremel) | Полная (схема JSON) | Частичная (сложные типы доступны) | Ограниченная (JSON — строки) |
| Экосистема | Широкая (Spark, Hive, Impala, Flink) | Широкая (Kafka, Hadoop) | В основном Hadoop/Hive | Универсальная (любые инструменты) |
| Совместимость с языками | Java, Python, C++, R, Go, Rust | Java, Python, C++, C#, Ruby | Java, C++, Python | Все |
Parquet и ORC (Optimized Row Columnar) являются основными конкурирующими колоночными форматами. ORC чаще используется в экосистеме Hive и обладает более продвинутыми встроенными индексами (Bloom filter, статистика), тогда как Parquet получил более широкую поддержку за пределами Hadoop (Spark, Pandas, AWS Glue, Google BigQuery).
Применение
Аналитика и Big Data
Parquet является основным форматом хранения данных в современных аналитических платформах:
- Apache Spark — стандартный формат для DataFrame, оптимизирован для использования в памяти (Tungsten).
- Apache Hive — используется для таблиц с партиционированием и bucket-хранением.
- Apache Impala — нативный формат чтения с поддержкой перекладывания предикатов на метаданные.
- Amazon Athena, Google BigQuery, Azure Synapse — поддерживают прямой запрос к файлам Parquet без загрузки в БД.
Облачные хранилища
Файлы Parquet часто размещаются в объектных хранилищах (S3, GCS, ADLS) и используются в архитектурах типа Data Lake (озеро данных). Сочетание малого размера файла (благодаря сжатию) и колоночного доступа позволяет выполнять запросы напрямую к десяткам терабайт данных с минимальными затратами.
Python и Data Science
Библиотека pandas поддерживает чтение/запись Parquet через модуль pyarrow или fastparquet. Это даёт возможность сохранять на диск подготовленные датафреймы в компактном формате, ускоряя загрузку по сравнению с CSV или Pickle. Parquet также используется в Apache Arrow как нативный формат обмена данными.
Инструменты и экосистема
- Apache Parquet — официальный проект Фонда Apache. Предоставляет библиотеки на Java (Parquet MR) и C++ (parquet-cpp).
- Apache Arrow — использует Parquet как формат файлового хранения, обеспечивая крос-языковой обмен данными.
- Pandas — через API
pd.read_parquet()иdf.to_parquet(). - Dask — поддерживает Parquet в кастомных датафреймах.
- Cloud-native — сервисы AWS (Glue, Athena, Redshift Spectrum), GCP (BigQuery, Dataflow), Azure (Data Factory, Synapse).
- Базы данных — ClickHouse, Vertica, Druid могут загружать данные из Parquet.
Ограничения
- Плохо подходит для транзакционных нагрузок (OLTP) — чтение одной строки требует загрузки нескольких мета-блоков и страниц, что медленнее строковых форматов.
- Сложность сжатия — при большом количестве уникальных значений в колонке словарь перестаёт быть эффективным.
- Не является потоковым форматом — для записи требуется буферизация данных до построения метаданных, что может создавать задержки при работе в режиме реального времени.
- Зависимость от схемы — все файлы в наборе должны иметь одинаковую схему и типы данных, что усложняет эволюцию схемы (schema evolution) без перезаписи данных.
Интересные факты
- Parquet не требует централизованного управления метаданными — вся информация хранится внутри каждого файла. Это делает формат самодостаточным для перемещения между системами.
- По данным проекта «Apache Parquet на конференциях 2023 года», около 70% объёмов данных в Azure Data Lake хранятся в формате Parquet.
- Формат поддерживает версионирование (Parquet 2.x с новыми типами, Parquet 1.x обратно совместим).
- Название «Parquet» происходит от французского слова, означающего паркетный пол — намёк на структурированное ровное представление колонок.
Источники
- Apache Parquet: официальная документация и спецификация формата (parquet.apache.org).
- «Dremel: Interactive Analysis of Web-Scale Datasets» — Mellnik et al., Google.
- «Parquet: A Columnar Storage Format for Hadoop» — проект Apache.
- Аналитические отчеты Qubole и Databricks об использовании форматов хранения в Big Data (2018–2023).
- Документация AWS, Google Cloud и Azure по формату Parquet в облачных хранилищах.
- «Форматы хранения данных: Parquet, Avro и ORC» — серия статей на Habr (информационно-технический ресурс).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →