2014-07-19 18 views
6

Ho una scala.collection.Set scalaSet : Set[Long].Come convertire scala.collection.Set in java.util.Set con serializzabile in un RDD

Come sarà possibile convertirlo in un java.util.Set con serializzabile. Ho provato il seguente codice, ma ho ottenuto 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 
    } 
} 

ho visto il filo notserializable exception when trying to serialize java map converted from scala di una risposta, ma la soluzione non ha funzionato con la serializzazione

risposta

4

Il problema di serializzazione con il scala.collection.JavaConvertions/JavaConverters è che questi convertitori sono wrapper che usano l'oggetto sottostante (scala/java). Sono semplicemente un wrapper e, quindi, per essere efficacemente serializzabile, devono avere una garanzia che la struttura sottostante è serializzabile.

La soluzione più semplice nel tuo caso è quello di implementare una copia strutturale nel vostro metodo di conversione:

// 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 
} 
+3

O semplicemente utilizzare il costruttore di copia: 'nuova java.util.HashSet (scalaSet)' – thSoft