2

我在 spark 程序中定义了一些 trait 和 class,打包到 jar 中时效果很好,但是如果在 spark repl 中执行,它将失败。

trait Builder {
  trait Layer {
    def layerSize: Int
  }

  abstract class Layer1 extends Layer

  class Layer2(val layerName: String) extends Layer {
    override def layerSize: Int = 10
    def addInput(from: Layer): String = {
      ""
    }
  }

  object Layer2  {
    def apply(name: String): Layer2 = {
      new Layer2(name)
    }
  }

  val FEATURES: Layer = new Layer1 {
    override val layerSize = 10
  }
}

class aBuilder extends Builder

然后我运行代码:

  val builder = new aBuilder
  val test = builder.Layer2("")
  test.addInput(builder.FEATURES)

它错误:

<console>:32: error: type mismatch;
 found   : builder.Layer
 required: builder.Layer
                test.addInput(builder.FEATURES)
4

1 回答 1

0

好的,以下似乎适用于 spark 1.6.0 和官方二进制文件(scala 2.10)

scala> trait Builder {
     |   trait Layer {
     |     def layerSize: Int
     |   }
     | 
     |   abstract class Layer1 extends Layer
     | 
     |   class Layer2(val layerName: String) extends Layer {
     |     override def layerSize: Int = 10
     |     def addInput(from: Layer): String = {
     |       ""
     |     }
     |   }
     | 
     |   object Layer2  {
     |     def apply(name: String): Layer2 = {
     |       new Layer2(name)
     |     }
     |   }
     | 
     |   val FEATURES: Layer = new Layer1 {
     |     override val layerSize = 10
     |   }
     | }
// defined trait Builder

scala> class aBuilder extends Builder
// defined class aBuilder

scala> :paste
// Entering paste mode (ctrl-D to finish)
val builder = new aBuilder
val test = builder.Layer2("")
test.addInput(builder.FEATURES)
// Exiting paste mode, now interpreting.
// builder: aBuilder = $iwC$$iwC$aBuilder@8f2513c
// test: builder.Layer2 = $iwC$$iwC$Builder$Layer2@561b39f4
// res0: String = ""

不过,我不确定它是否是以下问题的变体:SPARK-5149

于 2016-06-27T14:11:30.137 回答