Spark датафрейм в стрелку
Я уже некоторое время использую Apache Arrow с Spark в Python и с легкостью могу конвертировать между фреймами данных и объектами Arrow, используя Pandas в качестве посредника.
Однако недавно я перешел с Python на Scala для взаимодействия со Spark, и использование Arrow не так интуитивно понятно в Scala (Java), как в Python. Моя основная потребность - как можно быстрее преобразовать фрейм данных Spark (или RDD, поскольку они легко конвертируемы) в объект Arrow. Моей первоначальной мыслью было сначала перейти на Паркет и перейти от Паркет к Стрелке, поскольку я вспомнил, что Пиарроу мог читать с Паркет. Однако, пожалуйста, исправьте меня, если я ошибаюсь, посмотрев некоторое время на Java документацию Arrow, я не смог найти функцию Parquet to Arrow. Эта функция не существует в версии Java? Есть ли другой способ получить фрейм данных Spark для объекта Arrow? Возможно, преобразование столбцов dataframe в массивы, а затем преобразование в объекты-стрелки?
Любая помощь приветствуется. Спасибо
РЕДАКТИРОВАТЬ: Нашел следующую ссылку, которая преобразует схему паркета в схему стрелки. Но, похоже, он не возвращает объект Arrow из файла паркета, как мне нужно: https://github.com/apache/parquet-mr/blob/70f28810a5547219e18ffc3465f519c454fee6e5/parquet-arrow/src/main/java/org/apache/parquet/arrow/schema/SchemaConverter.java
4 ответа
В Java нет конвертера Parquet <-> Arrow, доступного как библиотека. Вы можете взглянуть на конвертер Parquet на основе Arrow в Dremio ( https://github.com/dremio/dremio-oss/tree/master/sabot/kernel/src/main/java/com/dremio/exec/store/parquet) для вдохновения. Я уверен, что проект Apache Parquet приветствовал бы ваш вклад в реализацию этой функциональности.
Мы разработали программу чтения / записи Arrow для Parquet в реализации C++: https://github.com/apache/parquet-cpp/tree/master/src/parquet/arrow. Поддержка вложенных данных еще не завершена, но она должна быть более полной в течение следующих 6–12 месяцев (как только появятся участники).
Теперь есть ответ, стрелку можно использовать для преобразования кадров данных Spark в кадры данных Pandas или при вызове пользовательских функций Pandas. См. Страницу документации SQL PySpark Pandas со стрелкой.
В Spark 3.3 будет
mapInArrow
Вызов API, аналогичный уже существующему
mapInPandas
вызов API.
Вот первый PR, который добавляет это в Python — https://github.com/apache/spark/pull/34505 .
Ко времени выпуска версии 3.3 будет еще один аналогичный вызов Spark Scala API.
Не уверен, что именно ваш вариант использования, но, похоже, это может помочь.
PS. Обратите внимание, что изначально этот API планировался как уровень разработчика, так как работа со Arrow поначалу может быть не очень удобной для пользователя. Это может быть здорово, если вы разрабатываете библиотеку поверх Spark/Arrow, например, когда вы можете абстрагироваться от некоторых нюансов Arrow.
Apache Arrow - это кросс-языковая платформа для разработки и поддерживает столбчатые структуры данных в памяти. Поскольку это межъязыковая платформа, она помогает писать на разных языках программирования, таких как Python, Java, C, C++, C#, Go, R, Ruby, JavaScript, MATLAB, Rust.
Поскольку он поддерживает Java, он также поддерживает язык Scala, так как оба работают поверх jvm. Но чтобы иметь функциональные возможности Scala для преобразования в объекты Scala в Arrow Objects, он должен пройти через python, потому что Arrow написан на python и широко поддерживает python.
В конечном итоге Python общается со Scala и предоставляет свойство jvm, доступное для его использования.
Пожалуйста, перейдите по ссылке ниже, где доступно подробное описание: https://databricks.com/session/accelerating-tensorflow-with-apache-arrow-on-spark-bonus-making-it-available-in-scala