У меня есть библиотека Scala, и я создаю оболочку Python поверх нее.Один класс моей библиотеки предоставляет следующий метод
package com.example
class F {
def transform(df: DataFrame): DataFrame
}
, и я использую py4j следующим образом для создания оболочки для F
def F():
return SparkContext.getOrCreate()._jvm.com.example.F()
, которая позволяет мне вызыватьmethod transform
Проблема в том, что объект Dataframe python явно отличается от объекта Dataframe Java.Для этой цели мне нужен способ конвертирования Python df в java, для которого я использую следующий код из py4j docs
class DataframeConverter(object):
def can_convert(self, object):
from pyspark.sql.dataframe import DataFrame
return isinstance(object, DataFrame)
def convert(self, object, gateway_client):
from pyspark.ml.common import _py2java
return _py2java(SparkContext.getOrCreate(), object)
protocol.register_input_converter(DataframeConverter())
Моя проблема в том, что теперь я хочу сделать обратное: получитьjava dataframe из transform
и продолжайте использовать его в python.Я пытался использовать protocol.register_output_converter
, но не смог найти ни одного полезного примера, кроме кода, касающегося коллекций Java.
Как я могу это сделать?Очевидным решением будет создание класса python F
, который определяет все методы, присутствующие в java F
, перенаправляет все вызовы python в jvm, возвращает результат и соответствующим образом конвертирует его.Этот подход работает, но он подразумевает, что я должен переопределить все методы F
, таким образом генерируя дублирование кода и намного больше поддержки