Parquet internals на собеседовании Data Engineer
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем разбирать на собесе
Parquet — стандарт data lake формата. На собесе DE: «как Parquet работает», «зачем row groups».
Структура Parquet файла
File Header (magic bytes "PAR1")
Row Group 1
Column Chunk for col1
Page 1, Page 2, ...
Column Chunk for col2
...
Row Group 2
...
File Footer:
Schema
Metadata (row group info, column stats)
Footer offset
PAR1 (magic bytes)Footer в конце — позволяет seek без чтения header. Reader знает offset → reads metadata → знает где именно нужные columns.
Row groups
Row group = horizontal partition. Дефолт 128 MB.
Зачем:
- Parallel reading (один thread на row group).
- Memory bound (не нужно держать весь file).
- Predicate pushdown работает на уровне row group.
Trade-off:
- Меньше row group → больше parallelism, но больше metadata overhead.
- Больше row group → лучше compression, но меньше parallelism.
Эмпирика: 128 MB-1 GB.
Column chunks и pages
Внутри row group — каждая column хранится separately (columnar).
Column chunk — все данные одной column в row group.
Page — внутри column chunk, ~1 MB. Самая мелкая unit для compression / I/O.
Page types:
- Data page — actual values.
- Dictionary page — для dictionary encoding.
- Index page — index в dictionary.
Encoding
Parquet применяет multiple encodings.
Plain. Просто values без compression.
Dictionary. Уникальные значения в dictionary, в data — indices.
RLE (Run Length Encoding). Sequence of same → (value, count).
Bit-packing. Малые ints в few bits.
Delta encoding. Хранит разницы (для timestamps / sorted).
Encoder choice — automatic based on data. Dictionary типично для low-cardinality strings.
Compression
Поверх encoding — compression.
- Snappy — fast, OK ratio. Default.
- Gzip — slower, better ratio.
- ZSTD — modern, balance.
- LZ4 — very fast.
- Brotli — best ratio, slow.
ZSTD — современный sweet spot.
Predicate pushdown
При чтении WHERE col > 100:
- Reader читает footer.
- Для каждого row group — min/max stats column.
- Если max < 100 — skip row group entirely.
Row Group 1: col min=0, max=50 → skip (max < 100)
Row Group 2: col min=80, max=200 → read
Row Group 3: col min=300, max=500 → readДля long-tail filter — экономит 99% I/O.
Bloom filter (Parquet 1.12+). Дополнительно — для equality filters на high-cardinality.
Связанные темы
- Parquet ORC Avro для DE
- Lakehouse Iceberg Delta для DE
- Iceberg deep на собесе DE
- Schema evolution для DE
- Подготовка к собесу Data Engineer
FAQ
Parquet vs ORC?
ORC из Hortonworks Hive экосистемы — лучше для Hive, чуть лучше compression, native ACID. Parquet — более широкое adoption (Spark, Snowflake, Iceberg). В 2026 — Parquet dominate.
Это официальная информация?
Нет. Статья основана на спецификации Apache Parquet.
Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.