Perché la corrispondenza del modello in Spark non funziona come in Scala? Vedi esempio sotto ... la funzione f()
tenta di eseguire lo schema di corrispondenza sulla classe, che funziona nel REPL di Scala, ma fallisce in Spark e restituisce tutti "???". f2()
è una soluzione alternativa che ottiene il risultato desiderato in Spark utilizzando .isInstanceOf()
, ma capisco che sia una cattiva forma in Scala.uguaglianza della classe caso in Apache Spark
Qualsiasi aiuto sul modello che corrisponda al modo corretto in questo scenario in Spark sarebbe molto apprezzato.
abstract class a extends Serializable {val a: Int}
case class b(a: Int) extends a
case class bNull(a: Int=0) extends a
val x: List[a] = List(b(0), b(1), bNull())
val xRdd = sc.parallelize(x)
tentativo di pattern matching che lavora a Scala REPL, ma non riesce a Spark
def f(x: a) = x match {
case b(n) => "b"
case bNull(n) => "bnull"
case _ => "???"
}
soluzione che funzioni in Spark, ma è di cattivo gusto (credo)
def f2(x: a) = {
if (x.isInstanceOf[b]) {
"b"
} else if (x.isInstanceOf[bNull]) {
"bnull"
} else {
"???"
}
}
Visualizza risultati
xRdd.map(f).collect //does not work in Spark
// result: Array("???", "???", "???")
xRdd.map(f2).collect // works in Spark
// resut: Array("b", "b", "bnull")
x.map(f(_)) // works in Scala REPL
// result: List("b", "b", "bnull")
Versioni utilizzati ... Risultati scintilla eseguiti in scintilla-shell (Spark 1.6 su AWS EMR-4.3) Scala REPL in SBT 0.13.9 (Scala 2.10.5)
Grazie zero323! Vedo menzionare il pattern matching che non funziona nello spark shell, ma non ci sono dettagli ... stai dicendo che se definisco le mie case class in un jar, sarò in grado di eseguire il pattern match su di loro nel REPL? Grazie ancora! – kmh
Esattamente. Definisci all'esterno, crea jar, includi in 'CLASSPATH' e importa. – zero323
Perfetto! Grazie ancora! – kmh