Unpickle / convert pyspark RDD of Rows to Scala RDD [Row]

时间:2017-06-26 14:38:55

标签: scala apache-spark pyspark scala-pickling

我想要实现的是执行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我能够重用并且它可以工作,但到目前为止只有一个方向。

0 个答案:

没有答案