use*_*637 6 java serialization scala-2.9 apache-spark rdd
我有一个scala.collection.Set scalaSet : Set[Long].
我如何能够将其转换为java.util.Set可序列化的.我尝试了以下代码,但得到了
java.io.notserializableexception: scala.collection.convert.wrappers$setWrapper
import scala.collection.JavaConversions._
Class MySerializableClass extends Serializable {
// method to implement the Scala to Java operations on the given RDD
def rddOps(dummyRDD: RDD[(Long, Set[Long])]) = {
val dummyRDDWithJavaSet = dummyRDD.map( {
case(key, value) => (key, scalaToJavaSetConverter(value))
}
// scala Set to Java Set Converters
def scalaToJavaSetConverter(scalaSet: Set[Long]): java.util.Set[Long] = {
val javaSet : java.util.Set[Long] = setAsJavaSet(scalaSet)
javaSet
}
}
Run Code Online (Sandbox Code Playgroud)
我在尝试序列化从scala转换的java地图时看到了线程不可序列化的异常,但是该解决方案不适用于序列化
序列化问题是scala.collection.JavaConvertions/JavaConverters这些转换器是使用底层(scala/java)对象的包装器。它们只是一个包装器,因此为了使其能够有效地序列化,它们必须保证底层结构是可序列化的。
对于您的情况,最简单的解决方案是在转换方法中实现结构副本:
// scala Set to Java Set Converters
def scalaToJavaSetConverter(scalaSet: Set[Long]): java.util.Set[Long] = {
val javaSet = new java.util.HashSet[Long]()
scalaSet.foreach(entry => javaSet.add(entry))
javaSet
}
Run Code Online (Sandbox Code Playgroud)