在spark-shell中加载伴侣对象

时间:2015-05-25 18:15:09

标签: scala apache-spark

当我使用:加载在spark-shell中时,看起来好像是单独读取的行,因此同伴对象不会在同一个" source"文件。 :paste似乎没有参数。

之前我正在使用我的代码构建并加载一个jar到spark-shell中但是为了简单起见我希望将它作为脚本运行。有没有人有最喜欢的解决方法?

2 个答案:

答案 0 :(得分:2)

最新的shell将包含:粘贴文件。

或者,作为一种解决方法,将模板链接到:加载它们:

class C(i: Int) {
  def c = { println("C..."); i }
}; object C {
  def apply(i: Int = 42) = new C(i)
}

或者,

scala> (new $intp.global.Run) compile List("C.scala")

scala> new C().c
C...
res1: Int = 42

更多API:

scala> import reflect.io._
import reflect.io._

scala> import reflect.internal.util._
import reflect.internal.util._

scala> val code = File("C.scala").slurp
code: String =
"
class C(i: Int) { def c = { println("C..."); i } }
object C { def apply(i: Int = 42) = new C(i) }
"

scala> $intp interpret code
defined class C
defined object C
res0: scala.tools.nsc.interpreter.IR.Result = Success

scala> C()
res1: C = C@f2f2cc1

类似地,

scala> $intp interpret s"object X { $code }"
defined object X
res0: scala.tools.nsc.interpreter.IR.Result = Success

scala> X.C()
res1: X.C = X$C@7d322cad

我的启动脚本定义:

implicit class `interpreter interpolator`(val sc: StringContext) { def i(args: Any*) = $intp interpret sc.s(args: _*) }

scala> i"val x = 42"
x: Int = 42
res0: scala.tools.nsc.interpreter.IR.Result = Success

答案 1 :(得分:0)

这个compile技巧似乎不适用于"脚本"文件。它期望源文件可由scalac编译,其中所有valdef声明都在一个类型中。

因此,与:load一起使用的另一种方法是将case类和伴随对象写入另一个对象中。在这里,我只是粘贴代码而不使用:paste,但它也适用于:load

scala> object O {
     |   case class C(s: String)
     |   object C {
     |     def apply() = new C("<no string>")
     |   }
     | }
defined module O

scala> O.C()
res0: O.C = C(<no string>)