首页 > 解决方案 > 在py4j中将Java对象转换为python

问题描述

我有一个 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 Dataframe 对象与Java Dataframe 对象明显不同。为此,我需要一种将 python df 转换为 java 的方法,为此我使用 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 数据帧transform并继续在 python 中使用它。我尝试使用protocol.register_output_converter但找不到任何有用的示例,除了处理 java 集合的代码。

我怎样才能做到这一点?一个明显的解决方案是创建一个 python 类F,它定义了 java 中存在的所有方法F,将所有 python 调用转发到 jvm,取回结果并相应地转换它。这种方法有效,但它意味着我必须重新定义所有方法,F从而生成代码重复和更多的维护

标签: javapythonapache-sparkpysparkpy4j

解决方案


推荐阅读