这似乎是:load 在spark-shell 中的一个功能。一种解决方案是将import 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
^
您可以使用:load 的-v 标志查看幕后发生的事情。
scala> :load -v hello.scala
Loading hello.scala...
scala>
scala> import org.apache.spark.rdd.RDD
import org.apache.spark.rdd.RDD
scala> class Hello {
| def get(rdd: RDD[String]): RDD[String] = 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
^
这让我猜测在类定义中引入 import 会有所帮助。它做到了! (让我大吃一惊)
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
您也可以使用: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.