3

在 Apache Zeppelin 中,我通过调用从 Java JAR 加载的类的静态函数来创建 JavaRDD 对象。是否可以使用 Pyspark 访问此 JavaRDD?

我已经能够通过以下低效的方法解决这个问题。我很高兴看到更清洁的解决方案。

Java部分:

  1. 将 RDD 的内容映射到它们的序列化版本(例如 JSON 字符串)。
  2. 将映射的 RDD 写入 Spark SQL 表。

Python部分:

  1. 从 SqlContext 访问表。

  2. 获取表的 RDD 并将其内容映射回其反序列化版本。

4

2 回答 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)
于 2015-08-23T09:18:23.430 回答
1

PySpark 提供了用于转换 RDD (java <-> python) 的函数:

from pyspark.mllib.common import _py2java, _java2py

pythonRDD = _java2py(sc, rddFromJava)

javaRDD = _py2java(sc, rddFromPython)
于 2016-01-07T02:57:56.473 回答