spark-shell "error: type mismatch", используя: paste для определения объекта класса / компаньона - PullRequest
0 голосов
/ 23 мая 2018

Использование spark-shell v1.6.

Большие различия при загрузке класса def и объекта-компаньона в зависимости от того, как это делается.

  • по одной строке за раз -OK
  • через :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)

Если я загрузил класс def и объект-компаньон с помощью :paste Iполучить эту ошибку ... чтобы быть понятным, Foo5 был определен только один раз в новом сеансе.Это не пример описанной здесь проблемы: «ошибка: несоответствие типов» в Spark с такими же найденными и требуемыми типами данных

<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 вызывает проблему и заставляет репетировать, что Foo5 неоднозначно?

1 Ответ

0 голосов
/ 23 мая 2018

Редактировать: эта ошибка была исправлена ​​в 2.11.9 , поэтому последняя версия 2.11.12 работает.

Редактировать: поскольку вы используете Spark 1.6, я предположил, что вы застряли на2.10.Это нормально, я только что снова взял Гомера на днях, и в очень старой версии (Lattimore, 1951).

Похоже, старая ошибка с тем, как оболочка Spark обрабатывает импорт из истории под -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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...