Parquet - это колоночный формат файла для сериализации данных. Чтение файла Parquet требует распаковки и декодирования его содержимого в некую структуру данных в памяти. Он разработан для экономии пространства / ввода-вывода за счет использования ЦП для декодирования. Он не предоставляет никаких структур данных для вычислений в памяти. Parquet - это потоковый формат, который необходимо декодировать от начала до конца, в то время как некоторые средства «индексной страницы» были добавлены в формат хранения в последнее время, в общем случае операции произвольного доступа являются дорогостоящими.
Стрелка, с другой стороны, это прежде всего библиотека, предоставляющая столбчатые структуры данных для вычислений в памяти . Когда вы читаете файл Parquet, вы можете распаковать и декодировать данные в столбчатые структуры данных Arrow, чтобы затем выполнять аналитику в памяти для декодированных данных. Столбчатый формат со стрелкой имеет несколько приятных свойств: произвольный доступ равен O (1), и каждая ячейка значения находится рядом с предыдущей и следующей в памяти ячейкой, поэтому эффективно выполнять итерации.
А как насчет "файлов стрелок"? Apache Arrow определяет двоичный протокол «сериализации» для организации коллекции столбчатых массивов Arrow (называемых «пакетной записью»), которые можно использовать для обмена сообщениями и межпроцессного взаимодействия. Вы можете поместить протокол в любое место, в том числе на диск, который впоследствии можно отобразить в памяти или прочитать в память и отправить в другое место.
Этот протокол Arrow разработан таким образом, что вы можете "отобразить" большой двоичный объект данных Arrow без какой-либо десериализации, поэтому при выполнении аналитики данных протокола Arrow на диске можно использовать отображение памяти и эффективно платить нулевую стоимость. Протокол используется для многих целей, таких как потоковая передача данных между Spark SQL и Python для запуска функций pandas для фрагментов данных Spark SQL, они называются «pandas udfs».
В некоторых приложениях Parquet и Arrow могут использоваться взаимозаменяемо для сериализации данных на диске. Некоторые вещи, которые нужно иметь в виду:
- Parquet предназначен для «архивных» целей. Это означает, что если вы напишете файл сегодня, мы ожидаем, что любая система, которая скажет, что может «читать Parquet», сможет прочитать файл через 5 лет или 7 лет. Мы еще не делаем это утверждение о долгосрочной стабильности формата Arrow (хотя мы могли бы в будущем)
- Паркет обычно намного дороже читать, потому что он должен быть декодирован в какую-то другую структуру данных. Данные протокола стрелки могут быть просто отображены в памяти.
- Файлы Parquet часто намного меньше, чем Arrow-protocol-on-disk из-за схем кодирования данных, которые использует Parquet. Если ваше дисковое хранилище или сеть работают медленно, лучшим выбором будет Parquet
Итак, в итоге, файлы Parquet предназначены для хранения на диске, Arrow - для хранения в памяти (но вы можете поместить его на диск, а затем отобразить карту памяти позже). Они предназначены для совместимости друг с другом и используются вместе в приложениях.
Для приложения с интенсивным объемом памяти я мог бы предложить взглянуть на библиотеку Arrow JavaScript (TypeScript).