Как класть Parquet 1: когда использовать

Для одного клиента написал подробную инструкцию об том, как работать с Parquet. Хотел сослаться на какие-нибудь приличные гайды в интернетах, но не обнаружил таковых ни на русском, ни на английском. Придется писать самому. Итак, начинаем цикл заметок.

Apache Parquet это файловый формат для поколоночного хранения структурированных данных, оптимизированный под использование с HDFS и Apache Spark. Он великолепно подходит для хранения тяжелых таблиц, их быстрого чтения и фильтрации. По производительности и компактности он оставляет далеко позади себя все неколоночные форматы. При этом он подходит далеко не для всех случаев. Давайте поговорим, когда имеет смысл его использовать, а когда лучше обойтись другими форматами.

В корне Parquet лежит идея компактного хранения данных отдельно для каждой колонки. Чтобы постигнуть эффект такого хранения, надо, чтобы данных было действительно много. Считается, что один файл Parquet должен весить не меньше 128 МБ. При росте размера одного файла до 512-1024 МБ и дальше эффективность только увеличивается. Если у вас мало данных, вероятно, вам не нужен Parquet.

Parquet для данных каждой колонки по отдельности применяет RLE, кодирование по словарю, упаковку битов, а также обычное сжатие GZIP или Snappy. Максимальный эффект достигается на большом числе строк, сортированных данных, целых числах, а также дробных числах и строках с невысокой кардинальностью (числом различных уникальных значений в колонке). Если у вас мало строк, но много столбцов, в данных много разнообразных текстов и не прослеживается порядок — Parquet не будет по-настоящему эффективен.

Parquet предназначен для write-once нагрузок. Изменение данных в файле невозможно в принципе, только путем полного переписывания файла. Append в файлы также не предусмотрен. При этом API Spark’а позволяет делать append к таблице в Parquet,  но это работает просто как создание новых файлов в той же директории. Если вам нужно делать много маленьких append-ов или иногда менять уже записанное содержимое, то Parquet не для вас.

Поколоночное хранение позволяет читать каждую колонку по отдельности, причем очень быстро. Наличие push-down predicates позволяет отбрасывать ненужные страницы еще до того, как они начали читаться. Таким образом, Parquet отлично подходит для аналитических запросов, читающих колонки целиком и фильтрующих их по каким-то условиям, например:
SELECT sum(revenue) FROM table WHERE gender = 1.
И, наоборот, совершенно не подходит для чтения отдельных строк, например:
SELECT * FROM table WHERE id = 1

Parquet был разработан в Twitter, сейчас поддерживается Cloudera. Основной упор в разработке делается на работу со Spark и Impala. Также поддерживаются автоматическое выведение схемы из метаданных и вложенные типы. Это делает Parquet идеальным кандидатом на использование со Spark и, вообще, с CDH. Однако, для Hive и HDP от Hortonworks лучше подойдет ORC.