Warum funktioniert die Mustererkennung in Spark nicht wie in Scala? Siehe Beispiel unten ... Die Funktion f()
versucht, eine Übereinstimmung für die Klasse zu finden, die in der Scala REPL funktioniert, aber in Spark fehlschlägt und alle "???" ergibt. f2()
ist eine Problemumgehung, die das gewünschte Ergebnis in Spark mit .isInstanceOf()
erhält, aber ich verstehe, dass schlechte Form in Scala.Fallklassengleichheit in Apache Spark
Jede Hilfe auf Muster, die den richtigen Weg in diesem Szenario in Spark übereinstimmen, würde sehr geschätzt werden.
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)
Versuch Pattern-Matching, die in Scala REPL funktioniert aber nicht in Funken
def f(x: a) = x match {
case b(n) => "b"
case bNull(n) => "bnull"
case _ => "???"
}
Abhilfe, die Funktionen in Spark, aber schlechte Form ist (glaube ich)
def f2(x: a) = {
if (x.isInstanceOf[b]) {
"b"
} else if (x.isInstanceOf[bNull]) {
"bnull"
} else {
"???"
}
}
Ergebnisse anzeigen
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")
Versionen verwendet ... Funken Ergebnisse laufen in Funkenschale (Spark-1.6 auf AWS EMR-4.3) Scala REPL in SBT 0.13.9 (Scala 2.10.5)
Danke zero323! Ich sehe die Erwähnung des Musterabgleichs, der dort in der Spark-Shell nicht funktioniert, aber keine Details ... Sie sagen, wenn ich meine Fall-Klassen in einem Jar definiere, kann ich ihnen in der REPL ein Muster zuordnen? Danke noch einmal! – kmh
Genau. Außerhalb definieren, jar erstellen, in den 'CLASSPATH' aufnehmen und importieren. – zero323
Perfekt! Danke noch einmal! – kmh