Разница между паркетом Apache и стрелой - PullRequest
3 голосов
/ 06 июня 2019

Я ищу способ ускорить интенсивное использование памяти в приложении. Я видел, что некоторые люди рекомендуют Apache Arrow, но пока я в этом разбираюсь, я запутался в разнице между Parquet и Arrow.

Они оба представляют собой столбчатую структуру данных. Первоначально я думал, что паркет для диска, а стрелка для формата в памяти. Тем не менее, я только что узнал, что вы можете сохранять стрелки в файлах на рабочем столе, например, abc.arrow. В таком случае, в чем разница? Разве они не делают то же самое?

1 Ответ

8 голосов
/ 06 июня 2019

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).

...