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)
温温酱
慕森王
守着一只汪
随时随地看视频慕课网APP