Parquet internals на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — 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.
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

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:

  1. Reader читает footer.
  2. Для каждого row group — min/max stats column.
  3. Если 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.

Связанные темы

FAQ

Parquet vs ORC?

ORC из Hortonworks Hive экосистемы — лучше для Hive, чуть лучше compression, native ACID. Parquet — более широкое adoption (Spark, Snowflake, Iceberg). В 2026 — Parquet dominate.

Это официальная информация?

Нет. Статья основана на спецификации Apache Parquet.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.