Допустим, у меня есть Scala код:
package com.mycompany
object Helper {
def process(df: DataFrame): DataFrame = {
// do some processing and return processed dataframe
}
}
Вышеупомянутый класс упакован в JAR и добавлен в путь к классам PySpark.
Теперь из PySpark я могу использовать вышеуказанный метод выполнить обработку на фрейме данных PySpark следующим образом:
# JVM version of Python DataFrame through the use of the _jdf property
scala_processed_jdf = sc._jvm.com.mycompany.Helper().process(df._jdf)
Также версия фрейма данных scala, возвращенная из вышеуказанной функции, может быть перенесена в фрейм данных pyspark следующим образом:
DataFrame(scala_processed_jdf, sqlContext)
Как я понимаю, PySpark использует Py4j для связи между Python и JVM.
- Но как эта версия фрейма данных этого pyspark отправляется в JVM?
- Сериализуется ли весь фрейм данных перед отправкой в JVM и десериализовывается обратно при отправке в PySpark, или просто ссылка
df._jdf
отправляется в JVM? - Какая библиотека сериализации PySpark использует для этого внутри? И сколько накладных расходов добавляет этот SerDe?
- Является ли хорошей практикой передача данных между PySpark и JVM, как показано выше?
Пожалуйста, помогите. Спасибо.