【发布时间】:2016-05-20 00:36:38
【问题描述】:
为什么 Spark 中的模式匹配与 Scala 中的模式匹配不同?请参阅下面的示例...函数f() 尝试对类进行模式匹配,该类在 Scala REPL 中有效,但在 Spark 中失败并导致所有“???”。 f2() 是一种使用 .isInstanceOf() 在 Spark 中获得所需结果的解决方法,但我知道这在 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 2.10.5) 中的 Scala REPL
【问题讨论】:
标签: scala apache-spark pattern-matching rdd case-class