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 (облачные и локальные хранилища)