我想要实现的是执行Scala代码。将结果Scala RDD [Row]转换为Rash的PySparkRDD。执行一些python操作并将pySpark Rows的RDD转换回Scala的RDD [Row]。 要获得RDD到pySpark RDD,我这样做: 在Scala我有这个方法
import org.apache.spark.sql.execution.python.EvaluatePython.{javaToPython, toJava}
def toPythonRDD(rdd: RDD[Row]): JavaRDD[Array[Byte]] = {
javaToPython(rdd.map(r => toJava(r, r.schema)))
}
稍后在pySpark中我创建了新的RDD调用
RDD(jrdd, sc, BatchedSerializer(PickleSerializer()))
我最终得到了pySpark Rows的RDD。我想恢复这个过程。 我可以通过访问rdd._jrdd轻松获得Scala的JavaRDD [Array [Byte]]。我的主要问题是我不知道hwo将它转换/取消回到RDD [Row]。 我试过了
sc._jvm.SerDe.pythonToJava(rdd._to_java_object_rdd(), True)
和
sc._jvm.SerDe.pythonToJava(rdd._jrdd, True)
两次崩溃都有类似的异常
net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.sql.types._create_row)
net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.sql.types._create_row)
我知道我可以轻松地在Scala和Python之间来回传递DF,但我的记录没有统一的架构。我正在使用Row的RDD,因为我虽然已经有一个pickler我能够重用并且它可以工作,但到目前为止只有一个方向。