Открыть сервис

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, RustJava, Python, C++, C#, RubyJava, 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 →