【发布时间】:2015-04-21 09:52:15
【问题描述】:
我已经围绕 spark-shell 构建了一个脚本工作流,但我经常对发现和所需类型相同的奇怪类型不匹配(可能继承自 scala repl)感到烦恼。下面的例子说明了这个问题。以粘贴模式执行,没问题
scala> :paste
// Entering paste mode (ctrl-D to finish)
import org.apache.spark.rdd.RDD
case class C(S:String)
def f(r:RDD[C]): String = "hello"
val in = sc.parallelize(List(C("hi")))
f(in)
// Exiting paste mode, now interpreting.
import org.apache.spark.rdd.RDD
defined class C
f: (r: org.apache.spark.rdd.RDD[C])String
in: org.apache.spark.rdd.RDD[C] = ParallelCollectionRDD[0] at parallelize at <console>:13
res0: String = hello
但是
scala> f(in)
<console>:29: error: type mismatch;
found : org.apache.spark.rdd.RDD[C]
required: org.apache.spark.rdd.RDD[C]
f(in)
^
有相关讨论about the scala repl和about the spark-shell 但提到的issue 似乎与我无关(并且已解决)。
这个问题会导致编写可通过的代码以在 repl 中交互执行的严重问题,或者导致失去在 repl 中工作的大部分优势。有解决办法吗? (和/或这是一个已知问题?)
编辑:
spark 1.2 和 1.3.0 出现问题。使用 scala 2.10.4 在 spark 1.3.0 上进行的测试
似乎,至少在测试中,重复使用与案例类定义分开的类的语句,缓解了问题
scala> :paste
// Entering paste mode (ctrl-D to finish)
def f(r:RDD[C]): String = "hello"
val in = sc.parallelize(List(C("hi1")))
// Exiting paste mode, now interpreting.
f: (r: org.apache.spark.rdd.RDD[C])String
in: org.apache.spark.rdd.RDD[C] = ParallelCollectionRDD[1] at parallelize at <console>:26
scala> f(in)
res2: String = hello
【问题讨论】:
-
嗯...我不确定,但我相信这个问题的根源在于
serialization。输入Cserializable后再试一次。 -
@SarveshKumarSingh 案例类默认是可序列化的。
-
@ShyamendraSolanki 是的,那是......但在最近
case class+spark-shell的问题中,有时简单的class有效。所以...尝试serializableclass(不是case class)应该值得一试, -
另外...对于我的所有失望...我无法重现问题。上面的代码在我的 Spark-shell 中运行良好。
-
在使用扩展
java.io.Serializable的类时,我的行为完全相同。我同时使用 spark 1.2 和 1.3,但我的测试是使用 1.3 进行的。我还意识到,如果我:paste将案例类定义与函数定义分开的代码,我没有问题......但在其他更复杂的情况下,我很确定它会失败......
标签: scala apache-spark read-eval-print-loop type-mismatch