Разница между паркетом Apache и стрелкой

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

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


person Audrey    schedule 06.06.2019    source источник


Ответы (1)


Parquet - это столбчатый формат файла для сериализации данных. Чтение файла Parquet требует распаковки и декодирования его содержимого в некую структуру данных в памяти. Он спроектирован так, чтобы экономить пространство / ввод-вывод за счет использования ЦП для декодирования. Он не предоставляет никаких структур данных для вычислений в памяти. Parquet - это потоковый формат, который необходимо декодировать от начала до конца, хотя недавно в формат хранения были добавлены некоторые средства "индексной страницы", в целом операции произвольного доступа являются дорогостоящими.

С другой стороны, Arrow - это, прежде всего, библиотека, предоставляющая столбчатые структуры данных для вычислений в памяти. При чтении файла Parquet вы можете распаковать и декодировать данные в столбчатые структуры данных со стрелками, чтобы затем можно было выполнять анализ декодированных данных в памяти. Столбчатый формат со стрелками имеет несколько хороших свойств: произвольный доступ - это 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).

person Wes McKinney    schedule 06.06.2019
comment
Ты великолепен! Спасибо! - person Audrey; 07.06.2019
comment
@Wes McKinney, in-memory означает, что должна быть какая-то платформа для хранения этих данных стрелок в памяти? какая-то вычислительная платформа в оперативной памяти, работающая в большом кластере? (например, что-то вроде Ignite)? - person Ashika Umanga Umagiliya; 16.12.2019
comment
@WesMcKinney, спасибо за отличное объяснение. Было интересно читать и очень полезно - person VB_; 11.05.2020
comment
есть ли у вас какие-либо учебные пособия или примеры доступа к памяти в таблице со стрелками? - person SnG; 23.10.2020
comment
Начиная с 1.0.0 (июль 2020 г.) Arrow имеет обратную совместимость. См. Здесь для информации: arrow.apache.org/blog/ 2020/07/24 / 1.0.0-релиз - person johnml1135; 05.11.2020
comment
У Arrow есть более актуальная страница с часто задаваемыми вопросами. И по состоянию на 11 июля 2021 года в часто задаваемых вопросах говорится, что паркет по-прежнему является лучшим выбором (вместо стрелки) для длительного хранения - While the Arrow on-disk format is stable and will be readable by future versions of the libraries, it does not prioritize the requirements of long-term archival storage. - person HCSF; 11.07.2021
comment
почему паркет упоминается как потоковый формат? Что это значит? Я предположил, что нам нужно проанализировать весь файл, чтобы иметь возможность читать данные. - person shadow0359; 11.07.2021