在Pyspark中访问JavaRDD

3
在Apache Zeppelin中,我通过调用从Java JAR加载的类的静态函数创建了一个JavaRDD对象。是否可能使用Pyspark访问此JavaRDD?
我已经能够通过以下低效的方法解决此问题。如果有更简洁的解决方案,我会很高兴看到。
引用部分: Java部分: 1.将RDD的内容映射到它们的序列化版本(例如JSON字符串)。 2.将映射的RDD写入Spark SQL表中。
Python部分: 1.从SqlContext中访问该表。 2.获取表格的RDD,并将其内容映射回其反序列化版本。

你能把你的解决方法作为一个答案添加进来吗?我很想看看它。(这也可以让你从问题中删除解决方法) - conradlee
2个回答

2

我找到了一个在大多数情况下应该有效的方法。 它有两个阶段:

首先,在Python环境中获取Java对象的句柄:如文档页面所述,ZeppelinContext类包含put()和get()方法,用于在不同的环境之间共享数据。

%spark    
z.put("rdd", rddToConvert) // z is the ZeppelinContext object.

%pyspark    
rddFromJava = z.get("rdd")

第二步,将Java RDD转换为Python RDD。我从这里获取了代码。

from pyspark.rdd import RDD    
pythonRdd = RDD(sc._jvm.SerDe.javaToPython(rddFromJava, sc)

在我的情况下,我正在尝试从Java转换一个pairRDD。使用这种方法,我的结果pythonRdd包含scala.Tuple2s...你知道如何将它们转换为Python对象吗? - Nick Resnick

1
PySpark提供了用于转换RDD(Java <-> Python)的函数:
from pyspark.mllib.common import _py2java, _java2py

pythonRDD = _java2py(sc, rddFromJava)

javaRDD = _py2java(sc, rddFromPython)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接