Scala 为什么spark shell无法加载导入了RDD的类的文件?

Scala 为什么spark shell无法加载导入了RDD的类的文件?,scala,apache-spark,Scala,Apache Spark,我使用Spark 2.1.1和Scala 2.11.8 在sparkshell内部,我使用:load命令来加载具有RDD方法的类 当我尝试加载该类时,出现以下编译错误: 错误:未找到:类型为RDD 为什么??我有进口声明 这就是我正在使用的代码 这似乎是的一项功能:在火花壳中加载。解决方案是将导入org.apache.spark.rdd.rdd(无点和下划线)移动到类定义中 这似乎不是特定于RDD类,而是任何导入的类。除非在类本身内部定义了import语句,否则它将无法工作 尽管如此,由于导入

我使用Spark 2.1.1和Scala 2.11.8

sparkshell
内部,我使用
:load
命令来加载具有RDD方法的类

当我尝试加载该类时,出现以下编译错误:

错误:未找到:类型为RDD

为什么??我有进口声明

这就是我正在使用的代码

这似乎是
的一项功能:在
火花壳中加载
。解决方案是将导入org.apache.spark.rdd.rdd(无点和下划线)移动到类定义中

这似乎不是特定于
RDD
类,而是任何导入的类。除非在类本身内部定义了
import
语句,否则它将无法工作

尽管如此,由于导入在类之外,以下内容将不起作用

import org.apache.spark.rdd.RDD
class Hello {
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load hello.scala
Loading hello.scala...
import org.apache.spark.rdd.RDD
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                                    ^
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                      ^
这让我猜测,在类定义中进行导入可能会有所帮助。的确如此!(令我大吃一惊)

您还可以使用
:paste
命令将类粘贴到
spark shell
。当您可以在自己的包中定义类时,存在所谓的原始模式

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> package mypackage
<console>:1: error: illegal start of definition
package mypackage
^

scala>

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

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

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

// Exiting paste mode, now interpreting.
package-mypackage
同学们好{
导入org.apache.spark.rdd.rdd
def get(rdd:rdd[String]):rdd[String]=rdd
}
scala>:加载-v hello.scala
加载你好,scala。。。
scala>PackageMyPackage
:1:错误:定义的开始非法
包我的包
^
斯卡拉>
scala>你好{
|导入org.apache.spark.rdd.rdd
|def get(rdd:rdd[String]):rdd[String]=rdd
| }
定义类Hello
scala>:粘贴-原始
//进入粘贴模式(按ctrl-D键完成)
包我的包
同学们好{
导入org.apache.spark.rdd.rdd
def get(rdd:rdd[String]):rdd[String]=rdd
}
//正在退出粘贴模式,现在正在解释。

这是spark shell中的一个错误,请参阅,并在spark 2.3.0中修复。请使用spark 2.3.0(或更高版本)或使用@Jacek Laskowski建议的方法!欢迎来到stackoverflow。请阅读。另外,尝试将代码/错误作为片段而不是图像发布。检查并确保提供的spark依赖项主要是类路径中添加的spark_core依赖项。在spark shell中工作时,类路径是否发挥作用?是的,但不适用于此问题,因为类属于spark。另外请注意,这不仅仅是RDD类特有的,而且对于任何被导入的类来说,除非在类本身内部定义了导入包,否则它将不起作用。但一个类中的多个定义可以导入多个类吗?我不知道。刚从你那里学到的!谢谢对于多个类,我们认为这是可以接受的,但需要测试,因为
:load
似乎在语法上增加了额外的规则(正如我们刚刚学到的)。
class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello
package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> package mypackage
<console>:1: error: illegal start of definition
package mypackage
^

scala>

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

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

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

// Exiting paste mode, now interpreting.