在py4j中将Java对象转换为python
我有一个spark Scala库,我正在其上构建一个python包装器。我的库的一个类提供了以下方法在py4j中将Java对象转换为python,java,python,apache-spark,pyspark,py4j,Java,Python,Apache Spark,Pyspark,Py4j,我有一个spark Scala库,我正在其上构建一个python包装器。我的库的一个类提供了以下方法 package com.example class F { def transform(df: DataFrame): DataFrame } 我以以下方式使用py4j为F def F(): return SparkContext.getOrCreate()._jvm.com.example.F() 这允许我调用方法transform 问题在于python数据帧对象显然不同于Java数据
package com.example
class F {
def transform(df: DataFrame): DataFrame
}
我以以下方式使用py4j为F
def F():
return SparkContext.getOrCreate()._jvm.com.example.F()
这允许我调用方法transform
问题在于python数据帧对象显然不同于Java数据帧对象。为此,我需要一种将python df转换为java df的方法,为此我使用py4j文档中的以下代码
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数据帧,并继续在python中使用它。我尝试使用协议。register\u output\u converter
,但除了处理java集合的代码外,我找不到任何有用的示例
我该怎么做?一个显而易见的解决方案是创建一个python类F
,该类定义javaF
中存在的所有方法,将所有python调用转发给jvm,获取结果并相应地进行转换。这种方法可行,但它意味着我必须重新定义F
的所有方法,从而产生代码重复和更多的维护性我的问题是如何自动注册这种行为,我的问题可能是如何自动注册这种行为,而不是在输入/输出中手动写入df转换