Apache Spark中的案例类相等
为什么Spark中的模式匹配与Scala中的模式匹配不同?参见下面的示例...函数f()
试图在类上进行模式匹配,该类在Scala REPL中有效,但在Spark中失败,并导致所有“ ???”。 f2()
是一种解决方法,可以在使用的Spark中获得所需的结果.isInstanceOf()
,但是我知道这在Scala中是不好的形式。
在此情况下,Spark中的模式正确匹配方面的任何帮助将不胜感激。
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)
尝试在Scala REPL中可用但在Spark中失败的模式匹配
def f(x: a) = x match { case b(n) => "b" case bNull(n) => "bnull" case _ => "???"}
解决方法在Spark中起作用,但格式不正确(我认为)
def f2(x: a) = { if (x.isInstanceOf[b]) { "b" } else if (x.isInstanceOf[bNull]) { "bnull" } else { "???" }}
查看结果
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")
使用的版本... Spark结果在spark-shell中运行(在AWS EMR-4.3上为Spark 1.6)在SBT 0.13.9中为Scala REPL(Scala 2.10.5)
慕森王
守着一只汪