Spark 2.0 Scala导入语句

4
在 Spark 1.6.2(Scala 2.10.5)中,以下代码在 shell 中运行良好:
import org.apache.spark.mllib.linalg.Vector
case class DataPoint(vid: String, label: Double, features: Vector)

在mlib技术中,Vector正确地取代了Scala Vector。

然而,在Spark 2.0(Scala 2.11.8)上运行同样的代码会在shell中抛出以下错误:

<console>:11: error: type Vector takes type parameters
  case class DataPoint(vid: String, label: Double, features: Vector)

为了使其起作用,现在我必须明确命名该类:
case class DataPoint(vid: String, label: Double,
  features: org.apache.spark.mllib.linalg.Vector)

请问有人可以告诉我发生了什么变化,是Spark或Scala的问题吗?谢谢!


2
他们改变了Spark Shell导入的方式,这引起了一些未解决的问题。你是在说从Shell运行吗? - som-snytt
@som-snytt 是的,我正在从 shell 运行 - 谢谢 - 我已更新问题。好的,那么很可能是个 bug。 - Roman
1个回答

4
最简单的解决方案是使用一个简单的“粘贴”操作:
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.0-SNAPSHOT
      /_/

Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_102)
Type in expressions to have them evaluated.
Type :help for more information.

scala> import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.Vector

scala> case class DataPoint(vid: String, label: Double, features: Vector)
<console>:11: error: type Vector takes type parameters
       case class DataPoint(vid: String, label: Double, features: Vector)
                                                                  ^

scala> :paste
// Entering paste mode (ctrl-D to finish)

import org.apache.spark.mllib.linalg.Vector
case class DataPoint(vid: String, label: Double, features: Vector)

// Exiting paste mode, now interpreting.

import org.apache.spark.mllib.linalg.Vector
defined class DataPoint

谢谢@zero323 - 你的解决方案确实有效!你能否详细说明一下它是如何工作的? - Roman
2
与逐行工作相比,差别在于一整个块编译在一起。基本上可以通过将所有内容放入同一块中,如{import....; case class DataPoint(...)}(我知道,没什么用)或包装为单个对象来实现相同的功能。但是,如果你问如何解决这个问题,我也不知道。Spark在处理shell时进行了深入的调整,那里有很多丑陋的错误,包括case class monster - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接