2015-11-19 16 views
9

Ho il seguente pezzo di codice in Spark:scala.ScalaReflectionException: <none> non è un termine

rdd 
    .map(processFunction(_)) 
    .saveToCassandra("keyspace", "tableName") 

Dove

def processFunction(src: String): Seq[Any] = 
    src match { 
    case "a" => List(A("a", 123112, "b"), A("b", 142342, "c")) 
    case "b" => List(B("d", 12312, "e", "f"), B("g", 12312, "h", "i")) 
    } 

Dove:

case class A(entity: String, time: Long, value: String) 
case class B(entity: String, time: Long, value1: String, value2: String) 

saveToCassandra aspetta una collezione di oggetti e utilizzando Seq[Any] come tipo di ritorno per contenere entrambi Seq[A] e interruzioni saveToCassandra con l'eccezione - scala.ScalaReflectionException: <none> non è un termine. Quale potrebbe essere la ragione di questo comportamento?

+0

Hai risolto questo? Attualmente ho lo stesso problema. – LiMuBei

risposta

0
def processFunction(src: String): (Any, Any) = { 
    src match { 
    case "a" => (A("a", 123112, "b"), A("b", 142342, "c")) 
    case "b" => (B("d", 12312, "e", "f"), B("g", 12312, "h", "i")) 
    } 
} 

Qualcosa del genere può funzionare. Non ho giocato troppo con il salvataggio di oggetti in cassandra. Né usare alcuno con cassandra. Tuttavia, la soluzione di cui sopra senza case classes e anys è come ho risolto un problema di recente. Ad esempio, il sotto funzionerebbe.

def processFunction(src: String): (String, Int, String) = { 
    src match { 
    case "a" => ("a", 123112, "b") 
    case "b" => ("d", 12312, "e") 
    } 
} 

Tuttavia, non è esattamente quello che desideri. Quindi sì, prendilo per quello che vuoi.

0

Ho affrontato questo problema e applicando la classe di casi su questo vi aiuterà a risolvere questo problema.

Di seguito è riportato l'esempio.

case class test_row(col1: String, 
       col2: String, 
       col3: String) 

E applicare questa classe di caso su un df/rdd.

df.map { x => test_row.apply(x.get(0).asInstanceOf[String], x.get(1).asInstanceOf[String],x.get(2).asInstanceOf[String]) 
}.rdd.saveToCassandra 

Questo risolto "nessuno" non è un problema a termine.