类型与 Spark 中的相同类型不匹配-shell
Type mismatch with identical types in Spark-shell
我已经围绕 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 and about the spark-shell
但提到的 issue 似乎与我无关(并且已解决)。
这个问题导致编写可通过的代码在 repl 中交互执行时出现严重问题,或者导致失去在 repl 中工作的大部分优势。有解决办法吗? (And/or 这是一个已知问题吗?)
编辑:
spark 1.2 和 1.3.0 出现问题。使用 scala 2.10.4
在 spark 1.3.0 上进行测试
看来,至少在测试中,重复使用 class 与 case class 定义分开的语句,可以缓解问题
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
不幸的是,有时这仍然是 open issue. Code in spark-shell is wrapped in classes and it causes strange behavior。
另一个问题:Errors like value reduceByKey is not a member of org.apache.spark.rdd.RDD[(...,...)]
可能是同一个项目中使用不同版本的spark引起的。如果您使用 IntelliJ,请转到 File -> Project Structure -> Libraries 并删除类似“SBT: org.apache.spark:spark-catalyst_2 的内容。 10:1.1.0:jar”。您需要 1.2.0 或 1.3.0 版 spark 的库。
希望对你有所帮助。
我已经围绕 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 and about the spark-shell 但提到的 issue 似乎与我无关(并且已解决)。
这个问题导致编写可通过的代码在 repl 中交互执行时出现严重问题,或者导致失去在 repl 中工作的大部分优势。有解决办法吗? (And/or 这是一个已知问题吗?)
编辑:
spark 1.2 和 1.3.0 出现问题。使用 scala 2.10.4
在 spark 1.3.0 上进行测试看来,至少在测试中,重复使用 class 与 case class 定义分开的语句,可以缓解问题
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
不幸的是,有时这仍然是 open issue. Code in spark-shell is wrapped in classes and it causes strange behavior。
另一个问题:Errors like value reduceByKey is not a member of org.apache.spark.rdd.RDD[(...,...)]
可能是同一个项目中使用不同版本的spark引起的。如果您使用 IntelliJ,请转到 File -> Project Structure -> Libraries 并删除类似“SBT: org.apache.spark:spark-catalyst_2 的内容。 10:1.1.0:jar”。您需要 1.2.0 或 1.3.0 版 spark 的库。
希望对你有所帮助。