Apache Parquet — это колоночный формат хранения данных, предназначенный специально для аналитических и Big Data задач. Чтобы понять, почему колоночное хранение так важно, рассмотрим принцип работы Parquet подробнее.


📌 1. Что такое колоночное хранение (Columnar Storage)?

Колоночное хранение — это подход, при котором данные хранятся не строками, а колонками.

Сравнение строкового и колоночного хранения:

Строковое (row-based):

[Row 1]: (id=1, name="Анна", age=25)
[Row 2]: (id=2, name="Олег", age=30)
[Row 3]: (id=3, name="Мария", age=28)

Данные хранятся последовательно по строкам:

1,Анна,25
2,Олег,30
3,Мария,28

Колоночное (column-based):

Данные хранятся отдельно по каждой колонке:

[id]:    [1, 2, 3]
[name]:  ["Анна", "Олег", "Мария"]
[age]:   [25, 30, 28]


📌 2. Как Parquet обрабатывает колоночные данные

Parquet разделяет данные на row groups, которые включают в себя наборы колонок (column chunks):

Parquet файл
├── Row Group 1
│   ├── Column Chunk (id)
│   │   ├── Data Page (1,2,3)
│   ├── Column Chunk (name)
│   │   ├── Data Page ("Анна","Олег","Мария")
│   └── Column Chunk (age)
│       ├── Data Page (25,30,28)
└── Row Group 2
    └── ...

Каждая колонка внутри Row Group хранится отдельно, что даёт максимальную эффективность:

  • Лёгкий доступ к отдельным колонкам.
  • Минимум чтения ненужных данных.

📌 3. Почему колоночное хранение важно?

🔥 A. Быстрое чтение только нужных данных

Большинство аналитических запросов читают лишь несколько колонок, а не весь набор данных.
Parquet читает только необходимые колонки, сокращая объём чтения с диска.

Пример: запрос, выбирающий только колонку “age”:

  • Row-based (строковое): читает все строки полностью.
  • Column-based (Parquet): читает только колонку “age”.

🔥 B. Высокая степень сжатия данных

В пределах одной колонки данные часто похожи, поэтому:

  • Parquet эффективно применяет сжатие (Snappy, ZSTD, GZIP).
  • Экономит дисковое пространство (особенно важно в облачных хранилищах).

🔥 C. Эффективное использование CPU и кэш-памяти

  • Данные в колонках хранятся последовательно.
  • CPU кэш эффективнее работает с такими данными, ускоряя обработку.

🔥 D. Поддержка метаданных и статистик

  • Parquet хранит статистики (min, max, count) для колонок.
  • Это позволяет ускорить фильтрацию и выполнять «predicate pushdown».

📌 4. Пример эффективности колоночного хранения

Запрос:

SELECT AVG(age) FROM users WHERE age > 25;

В строковом формате (CSV, JSON):

  • Читает весь файл.
  • Читает все строки, включая ненужные колонки (id, name).

В Parquet (Column-based):

  • Читает только колонку age.
  • Использует метаданные, чтобы пропустить блоки с age 25.
  • Выполняет запрос намного быстрее.

📌 5. Преимущества колоночного хранения (итоговая таблица)

ХарактеристикаКолоночный (Parquet)Строковый (CSV, JSON)
Скорость аналитических запросов✅ Высокая❌ Низкая
Эффективность сжатия✅ Очень высокая❌ Низкая
Чтение только нужных данных✅ Да❌ Нет
Эффективность CPU и кэш-памяти✅ Высокая❌ Низкая
Гибкость схемы✅ Schema Evolution❌ Ограниченно

📌 6. Когда особенно важно использовать Parquet

  • Аналитические задачи (BI, ML, отчёты)
  • Большие объёмы данных (Big Data)
  • Data Lakes (облачные и локальные хранилища)