Эффективность сжатия Parquet и ORC сильно зависит от ваших данных.Без сжатия Паркет по-прежнему использует кодировки для сжатия данных.Кодировки используют более простой подход, чем сжатие, и часто дают результаты, аналогичные универсальному сжатию для однородных данных.Наиболее часто используемое кодирование для Parquet - это словарное кодирование.Мы храним каждое уникальное значение строки в словаре и сохраняем индекс этого значения в словаре.Когда данные в столбце содержат неуникальные записи, это удаляет дублирование значений.Но это также добавляет накладные расходы, которые мы храним дополнительное целое число на строку.Хотя Parquet использует наименьший возможный целочисленный тип, если у вас есть только уникальные значения в столбце, общая память для этого столбца будет больше, чем без «индексов».В этом случае вам следует просто использовать словарную кодировку.
В случае, когда в вашем столбце много повторяющихся значений, мы обычно получаем более высокий выход за счет словаря-кодирования-затем-сжатия.Рассмотрим строковый столбец с 2 уникальными значениями по 16 байт, но по 1024 строкам.В случае передачи значений в виде компрессора, мы бы сжали сразу 16 КБ.
При кодировании словаря у нас был бы словарь из 32 байтов и 1024 int1
(бит) значений.Таким образом, мы уже сократили бы размер данных со сжатием словаря до 160 байт.Сжатие данных на величину, меньшую, всегда быстрее, независимо от энтропии.
Для большинства данных реального мира эффективность кодирования + сжатия обычно находится где-то между двумя перечисленными случаями.