在 Apache Zeppelin 中,我通过调用从 Java JAR 加载的类的静态函数来创建 JavaRDD 对象。是否可以使用 Pyspark 访问此 JavaRDD?
我已经能够通过以下低效的方法解决这个问题。我很高兴看到更清洁的解决方案。
Java部分:
- 将 RDD 的内容映射到它们的序列化版本(例如 JSON 字符串)。
- 将映射的 RDD 写入 Spark SQL 表。
Python部分:
从 SqlContext 访问表。
获取表的 RDD 并将其内容映射回其反序列化版本。
在 Apache Zeppelin 中,我通过调用从 Java JAR 加载的类的静态函数来创建 JavaRDD 对象。是否可以使用 Pyspark 访问此 JavaRDD?
我已经能够通过以下低效的方法解决这个问题。我很高兴看到更清洁的解决方案。
Java部分:
- 将 RDD 的内容映射到它们的序列化版本(例如 JSON 字符串)。
- 将映射的 RDD 写入 Spark SQL 表。
Python部分:
从 SqlContext 访问表。
获取表的 RDD 并将其内容映射回其反序列化版本。
我找到了一种适用于大多数情况的方法。它有两个阶段:
首先,在 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)
PySpark 提供了用于转换 RDD (java <-> python) 的函数:
from pyspark.mllib.common import _py2java, _java2py
pythonRDD = _java2py(sc, rddFromJava)
javaRDD = _py2java(sc, rddFromPython)