首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >spark-shell“错误:类型不匹配”使用:粘贴来定义类/伴生对象

spark-shell“错误:类型不匹配”使用:粘贴来定义类/伴生对象
EN

Stack Overflow用户
提问于 2018-05-24 02:39:09
回答 1查看 211关注 0票数 1

使用spark-shell v1.6。

当我加载一个类def和它的伴生对象时,会有很大的不同,这取决于它是如何完成的。

  • 一次一行- OK
  • via :paste - PROBLEM

首先要做的是...因为repl发现加载同名的伴生对象是不明确的,所以我给它起了一个不同的名字。这没问题。安装程序看起来像这样...

代码语言:javascript
复制
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) }
}

现在让我们对这个类做一些简单的事情。

代码语言:javascript
复制
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

代码语言:javascript
复制
<console>:42: error: type mismatch;
found   : List[Foo5]
required: List[Foo5]
        val ls_foo: List[Foo5] = ls_i.map(Foo5Companion.apply)

但是..。

如果我逐行加载相同的def(不使用:paste)...它工作得很好。

代码语言:javascript
复制
ls_foo: List[Foo5] = List($iwC$$iwC$Foo5@66f1a93a, $iwC$$iwC$Foo5@39d53a3, $iwC$$iwC$Foo5@4dddf42f)

我的问题是。有什么关系呢?为什么:paste会引起问题,并使repl认为Foo5是模棱两可的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
  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时,它将被修复:

代码语言:javascript
复制
$ ~/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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50495293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档