Dlaczego dopasowywanie wzorców w Spark nie działa tak samo jak w Scali? Zobacz przykład poniżej ... funkcja f()
próbuje dopasować do wzorca na klasie, która działa w Scala REPL, ale kończy się niepowodzeniem w Sparku i daje w wyniku wszystkie "???". f2()
to obejście, które uzyskuje pożądany wynik w Sparku przy użyciu .isInstanceOf()
, ale rozumiem, że jest to zła forma w Scali.Równość klasy Case w Apache Spark
Każda pomoc dotycząca wzoru pasującego do prawidłowego sposobu w tym scenariuszu w Sparku byłaby bardzo doceniana.
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)
próba dopasowania wzorca, który działa w Scala REPL ale nie w Spark
def f(x: a) = x match {
case b(n) => "b"
case bNull(n) => "bnull"
case _ => "???"
}
obejścia, który funkcjonuje w Spark, ale jest zła forma (chyba)
def f2(x: a) = {
if (x.isInstanceOf[b]) {
"b"
} else if (x.isInstanceOf[bNull]) {
"bnull"
} else {
"???"
}
}
Zobacz wyniki
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")
Wersje stosowane ... Wyniki zapłonowe prowadzone w zapłonowej-shell (Spark 1.6 na AWS EMR-4.3) Scala REPL w SBT 0.13.9 2.10.5 (Scala)
Dzięki zero323! Widzę wzmianki o dopasowywaniu wzorów, które nie działają w powłoce iskrzenia, ale nie ma szczegółów ... mówisz, że jeśli zdefiniuję moje klasy przypadków w słoiku, to będę w stanie dopasować do nich wzór w REPL? Dzięki jeszcze raz! – kmh
Dokładnie. Zdefiniuj zewnętrzne, zbuduj słoik, dołącz do 'CLASSPATH' i importuj. – zero323
Idealny! Dzięki jeszcze raz! – kmh