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

Формат Parquet

Parquet — это формат хранения колоночных данных с открытым исходным кодом, предназначенный для эффективной обработки больших объёмов структурированных и полуструктурированных данных. Он обеспечивает высокую степень сжатия и производительность запросов за счёт колоночного хранения, что делает его одним из стандартов в экосистеме больших данных (Big Data), особенно в средах Apache Hadoop и Apache Spark.

История

Формат Parquet был разработан совместно компаниями Twitter и Cloudera в 2013 году. Изначально он создавался как альтернатива существовавшим на тот момент форматам хранения данных, таким как Avro, Thrift и SequenceFile, которые не обеспечивали достаточной эффективности для аналитических запросов, требующих считывания только части столбцов. Первая стабильная версия (1.0.0) была выпущена в 2014 году. В 2015 году проект вошёл в инкубатор Apache Software Foundation, а в 2017 году получил статус проекта верхнего уровня (Top-Level Project) фонда Apache. Развитие формата продолжается под эгидой Apache, а его спецификация является открытой.

Основные принципы и архитектура

Колоночное хранение

В отличие от строчных форматов (например, CSV, JSON, Avro), где данные одной строки хранятся последовательно, Parquet хранит данные одного столбца вместе. Это позволяет при выполнении аналитических запросов считывать только необходимые столбцы, а не всю строку целиком, что значительно сокращает объём ввода-вывода (I/O) и ускоряет обработку.

Вложенная структура данных

Parquet поддерживает сложные вложенные структуры данных, такие как массивы, списки и вложенные записи (structs). Для эффективного хранения таких структур используется модель записи данных на основе формата Dremel (разработанного Google). Эта модель позволяет хранить вложенные данные без потери производительности, характерной для традиционных реляционных баз данных.

Сжатие и кодирование

Parquet поддерживает несколько алгоритмов сжатия на выбор пользователя, включая Snappy, Gzip, LZ4, ZSTD и Brotli. Кроме того, формат использует различные техники кодирования для уменьшения размера данных без потери информации, такие как:

  • RLE (Run-Length Encoding): эффективен для столбцов с повторяющимися значениями.
  • Delta encoding: эффективен для монотонно возрастающих или убывающих числовых последовательностей.
  • Dictionary encoding: замена длинных строковых значений короткими целочисленными идентификаторами.

Схема данных

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

Структура файла Parquet

Файл Parquet состоит из следующих основных компонентов:

  1. Magic Number (Магическое число): 4-байтовая последовательность PAR1 в начале и конце файла, идентифицирующая его как файл Parquet.
  2. Row Group (Группа строк): Логическое разделение данных на набор строк. Каждая группа строк содержит все столбцы для своего диапазона строк. Размер группы строк (например, 128 МБ) влияет на производительность: большие группы улучшают сжатие, но увеличивают время на чтение одной группы.
  3. Column Chunk (Фрагмент столбца): Часть данных одного столбца внутри одной группы строк. Каждый фрагмент столбца хранится в отдельном блоке и может быть сжат и закодирован независимо.
  4. Page (Страница): Минимальная единица хранения внутри фрагмента столбца. Данные разбиваются на страницы (обычно размером 8-64 КБ), что позволяет эффективно считывать только необходимые части столбца.
  5. Metadata (Метаданные): В конце файла хранится метаинформация, включающая схему данных, информацию о группах строк (количество строк, смещения, размеры, статистики по столбцам, такие как min, max, null count). Эта статистика позволяет системам обработки пропускать целые группы строк, если они не содержат интересующих данных (predicate pushdown).

Преимущества и недостатки

Преимущества

  • Высокая производительность запросов: Колоночное хранение и predicate pushdown позволяют обрабатывать запросы к большим наборам данных (терабайты и петабайты) в разы быстрее, чем при использовании строчных форматов.
  • Эффективное сжатие: Данные одного столбца часто имеют одинаковый тип и повторяющиеся значения, что позволяет достичь высоких коэффициентов сжатия (обычно в 2-5 раз по сравнению с не сжатыми данными, а иногда и до 10 раз).
  • Поддержка сложных структур: Возможность хранить вложенные данные без денормализации.
  • Открытый стандарт: Широкая поддержка в большинстве современных систем обработки данных (Apache Spark, Apache Hive, Apache Impala, Presto, Amazon Athena, Google BigQuery, Microsoft Azure Synapse Analytics, Pandas (через библиотеку PyArrow) и многих других).
  • Самодокументируемость: Схема данных хранится внутри файла.

Недостатки

  • Не подходит для точечных обновлений: Parquet — это формат, оптимизированный для чтения и пакетной записи (batch write). Обновление или удаление отдельных строк требует перезаписи всего файла или группы строк.
  • Сложность для потоковой обработки: Из-за необходимости буферизации данных для формирования групп строк, Parquet не является оптимальным выбором для систем реального времени (streaming), где данные поступают непрерывно.
  • Оверхед на метаданные: Для небольших файлов (несколько мегабайт) метаданные могут составлять значительную часть объёма, что снижает эффективность.

Применение

Parquet широко используется в следующих сценариях:

  • Хранение данных в озёрах данных (Data Lakes): Является одним из основных форматов для хранения данных в системах типа Apache Hadoop, Amazon S3, Azure Data Lake Storage.
  • Аналитические запросы (OLAP): Оптимизирован для выполнения агрегаций, фильтрации и группировок по столбцам.
  • Машинное обучение: Используется для хранения подготовленных наборов данных (feature stores) для обучения моделей, так как позволяет быстро считывать только необходимые признаки.
  • Обмен данными: Благодаря открытому стандарту и поддержке многими инструментами, Parquet часто используется для обмена большими объёмами данных между различными системами.

Сравнение с другими форматами

ХарактеристикаParquetAvroORCCSV / JSON
Тип храненияКолоночныйСтрочныйКолоночныйСтрочный
СжатиеОтличноеХорошееОтличноеПлохое
Производительность запросовВысокаяНизкаяВысокаяОчень низкая
Поддержка схемыДаДаДаНет (для CSV) / Частично (для JSON)
Поддержка вложенных данныхДаДаДаОграниченная (JSON)
Точечные обновленияНетДа (через append)НетДа (через append)
Основное применениеАналитика, Data LakesПотоковая передача, сериализацияАналитика, HiveПростота, обмен данными

Интересные факты

  • Название «Parquet» происходит от французского слова «паркет» (вид напольного покрытия), что символизирует «укладку» данных в виде колонок, подобно укладке паркетных досок.
  • Формат Parquet был вдохновлён системой Google Dremel, которая использовала колоночное хранение для выполнения интерактивных запросов к большим наборам данных.
  • По данным опросов и исследований, Parquet является одним из самых популярных форматов для хранения данных в экосистеме Apache Spark, часто превосходя по популярности Avro и ORC.

Источники

  1. Apache Parquet Official Documentation. (n.d.). Apache Parquet. Retrieved from https://parquet.apache.org/docs/
  2. Melnik, S., Gubarev, A., Long, J. J., Romer, G., Shivakumar, S., Tolton, M., & Vassilakis, T. (2010). Dremel: Interactive Analysis of Web-Scale Datasets. Proceedings of the VLDB Endowment, 3(1-2), 330-339.
  3. Vohra, D. (2016). Apache Parquet. In: Practical Hadoop Ecosystem. Apress, Berkeley, CA.
  4. White, T. (2015). Hadoop: The Definitive Guide (4th ed.). O'Reilly Media.
  5. Apache Software Foundation. (2017). Parquet Graduation. Retrieved from https://blogs.apache.org/foundation/entry/the-apache-software-foundation-announces-51

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →