【问题标题】:spark-shell "error: type mismatch" using :paste to define class/companion objectspark-shell“错误:类型不匹配”使用 :paste 定义类/伴侣对象
【发布时间】:2018-05-31 19:20:03
【问题描述】:

使用 spark-shell v1.6。

加载类 def 及其伴随对象时的巨大差异取决于它是如何完成的。

  • 一次一行 - 好的
  • 通过:paste - 问题

首先...由于 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)

但是……

如果我逐行加载相同的定义(不使用:paste)...它工作正常...

ls_foo: List[Foo5] = List($iwC$$iwC$Foo5@66f1a93a, $iwC$$iwC$Foo5@39d53a3, $iwC$$iwC$Foo5@4dddf42f)

我的问题是......有什么区别?为什么:paste 会导致问题并让repl 认为Foo5 是模棱两可的?

【问题讨论】:

  • 我认为这可能是与链接问题相同的潜在问题;那里的“跟踪你脑海中的一切”的建议并不友好;这是 REPL 的工作。

标签: scala apache-spark


【解决方案1】:

编辑:这个错误是fixed in 2.11.9,所以最新的 2.11.12 有效。

编辑:由于您使用的是 Spark 1.6,我想您会被困在 2.10 上。没关系,前几天我刚刚又拿起了 Homer,而且是一个非常旧的版本(Lattimore,1951)。

Spark shell 如何处理来自-Yrepl-class-based 下的历史记录的导入看起来像是一个老错误。

-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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2020-10-02
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多