使用spark-shell v1.6。
当我加载一个类def和它的伴生对象时,会有很大的不同,这取决于它是如何完成的。
:paste
- PROBLEM首先要做的是...因为repl发现加载同名的伴生对象是不明确的,所以我给它起了一个不同的名字。这没问题。安装程序看起来像这样...
import scala.util.Try
class Foo5(val i: Int)
object Foo5Companion {
def apply(i: Int): Foo5 = new Foo5(i)
def apply(d: Double): Foo5 = new Foo5(d.toInt)
def applyTry(i: Int): Try[Foo5] = Try { apply(i) }
def applyTry(d: Double): Try[Foo5] = Try { apply(d) }
}
现在让我们对这个类做一些简单的事情。
val ls_i: List[Int] = List(1,2,3)
val ls_foo: List[Foo5] = ls_i.map(Foo5Companion.apply)
如果我用:paste
加载了类def和伴生对象,我会得到这个错误...需要明确的是,Foo5在新会话中只定义了一次。这不是这里描述的问题的一个实例:"error: type mismatch" in Spark with same found and required datatypes
<console>:42: error: type mismatch;
found : List[Foo5]
required: List[Foo5]
val ls_foo: List[Foo5] = ls_i.map(Foo5Companion.apply)
但是..。
如果我逐行加载相同的def(不使用:paste
)...它工作得很好。
ls_foo: List[Foo5] = List($iwC$$iwC$Foo5@66f1a93a, $iwC$$iwC$Foo5@39d53a3, $iwC$$iwC$Foo5@4dddf42f)
我的问题是。有什么关系呢?为什么:paste
会引起问题,并使repl认为Foo5
是模棱两可的?
发布于 2018-05-24 04:25:21
编辑:这个bug是fixed in 2.11.9的,所以最新的2.11.12可以工作。
编辑:既然你在Spark 1.6上,我想你会被困在2.10上。没关系,前几天我又拿起了荷马,而且是一个非常老的版本(Lattimore,1951)。
这看起来像是Spark shell在-Yrepl-class-based
下处理历史导入的老bug。
使用-Xprint:typer
import scala.util.Try;
import $line3.$read.INSTANCE.$iw.$iw.Foo5;
private[this] val $line3$read: $line3.$read = $line3.$read.INSTANCE;
<stable> <accessor> def $line3$read: $line3.$read = $iw.this.$line3$read;
import $iw.this.$line3$read.$iw.$iw.Foo5Companion;
一个导入是通过别名成员进行的,因此两个Foo5
的路径是不同的。
在这种情况下,您可以使用:load
而不是:paste
。通常情况下,您会使用:paste
同伴。
这不是安慰,但当Spark升级到2.12时,它将被修复:
$ ~/scala-2.11.8/bin/scala -Yrepl-class-based
Welcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_171).
Type in expressions for evaluation. Or try :help.
scala> :paste foo5.scala
Pasting file foo5.scala...
import scala.util.Try
defined class Foo5
defined object Foo5Companion
scala> val ls_i: List[Int] = List(1,2,3)
ls_i: List[Int] = List(1, 2, 3)
scala> val ls_foo: List[Foo5] = List(1,2,3).map(Foo5Companion.apply)
<console>:15: error: type mismatch;
found : List[Foo5]
required: List[Foo5]
val ls_foo: List[Foo5] = List(1,2,3).map(Foo5Companion.apply)
^
scala> :quit
$ scala -Yrepl-class-based
________ ___ / / ___
/ __/ __// _ | / / / _ |
__\ \/ /__/ __ |/ /__/ __ |
/____/\___/_/ |_/____/_/ | |
|/ version 2.12.6
scala> :paste foo5.scala
Pasting file foo5.scala...
import scala.util.Try
defined class Foo5
defined object Foo5Companion
scala> val ls_i: List[Int] = List(1,2,3)
ls_i: List[Int] = List(1, 2, 3)
scala> val ls_foo: List[Foo5] = List(1,2,3).map(Foo5Companion.apply)
ls_foo: List[Foo5] = List(Foo5@52354202, Foo5@6b1321b7, Foo5@342ee097)
https://stackoverflow.com/questions/50495293
复制相似问题