在Spark-shell中键入与不同类型不匹配的内容

时间:2015-04-21 09:52:16

标签: scala apache-spark read-eval-print-loop type-mismatch

我已经围绕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 replabout the spark-shell 但提到的issue似乎与我无关(并已解决)。

此问题导致编写可传递代码以在repl中以交互方式执行的严重问题,或导致失去在repl中开始工作的大部分优点。有解决方案吗? (和/或它是一个已知问题?)

编辑:

spark 1.2和1.3.0出现问题。使用scala 2.10.4在spark 1.3.0上进行测试

似乎至少在测试中,使用类与case类定义分开重复语句,缓解问题

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

1 个答案:

答案 0 :(得分:3)

不幸的是,这仍然是open issue。 spark-shell中的代码包含在类中,有时会导致strange behavior

另一个问题:Errors like value reduceByKey is not a member of org.apache.spark.rdd.RDD[(...,...)]可能是因为在同一个项目中使用不同版本的spark。如果您使用IntelliJ,请转到文件 - &gt;项目结构 - &gt;库并删除诸如“ SBT:org.apache.spark:spark-catalyst_2.10: 1.1.0 :jar ”之类的内容。您需要使用spark版本为1.2.0或1.3.0的库。

希望它会以某种方式帮助你。