【问题标题】:Type mismatch with identical types in Spark-shell类型与 Spark-shell 中的相同类型不匹配
【发布时间】: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 replabout 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。输入C serializable 后再试一次。
  • @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


【解决方案1】:

很遗憾,这仍然是open issue。 spark-shell 中的代码包含在类中,有时会导致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"。您需要使用 spark 版本 1.2.0 或 1.3.0 的库。

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

【讨论】:

  • 我没有任何类型的项目设置。我明确地启动了 spark shell 并向其发送击键,因此我总是使用单个版本的 spark(或者我错过了什么?)
  • 如果你使用 spark 1.2.0 你应该导入这些函数:Import org.apache.spark.SparkContext._ , spark.apache.org/docs/1.2.0/api/scala/…
  • 我想你误会了。我在评论中写的这个问题也与 repl 有关,如果案例类单独或与另一个命令一起放在 :paste 环境中。在某些情况下(我还没有做一个简单的例子),当我在 val 中使用 case 类,并将它与 case 类同时粘贴时,我得到了这个错误而不是一个干净的执行(这会导致无论如何,一些类型不匹配......)。但这只是一个评论,如果它与这个问题有关,它可能不是同一个问题。不知道你们后半部分的回答该不该在这里。
  • 啊,对不起。我只是试图猜测除了这个案例类 repl 问题之外可能有什么问题。我没有更多的猜测:(
  • np,谢谢你的回答!我也许应该让这个问题成为一个真正的问题,而不是评论,但它是如此相关,我认为它几乎是重复的,只是另一个症状。当我有时间做一个简单的例子时,我可能会编辑我的问题。
猜你喜欢
  • 2015-06-04
  • 2019-06-26
  • 2018-03-10
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多