为什么Spark应用程序代码需要是一个对象而不是一个类?

时间:2018-03-07 00:13:10

标签: scala apache-spark

我在运行Spark应用程序时遇到了Exception in thread "Driver" java.lang.NullPointerException,这是因为我的代码位于class而不是object内,如建议的here。但是,只是想知道为什么主类必须是object。是否可以使用类?

2 个答案:

答案 0 :(得分:3)

这是Scala本身的一个问题,而不是Spark。编译Scala <root> <channel id="Digi.TR"> <display-name lang="tr">Digi</display-name> <url>http://www.digiturk.com.tr</url> </channel> <channel id="Star.tr"> <display-name lang="tr">Star</display-name> <url>http://www.digiturk.com.tr</url> </channel> <channel id="ATV.tr"> <display-name lang="tr">ATV</display-name> <url>http://www.digiturk.com.tr</url> </channel> </root> 时,内部方法不会转换为Java静态方法的等效方法。这意味着main方法不会是 static ,因此JVM在执行程序时将无法找到它。相比之下,Scala class中的所有方法都将是 static 。可以找到差异的良好解释here

由于主要方法需要位于object,因此无法仅使用单个class。但是,有object可以只创建object的实例以及class中的所有其他代码 - 但是当您可以简单地创建{{}时,似乎没有必要1}}改为class

答案 1 :(得分:2)

我会按顺序回答你的问题:

为什么主类必须是一个对象

这是因为Scala中不存在静态成员(方法或字段)。 Scala不是定义静态成员,而是在单例对象中声明这些成员。

一个对象是一个只有一个实例的类,它在引用时会被懒惰地创建。因此,当我们声明Object时,我们声明一个单例对象。

是否可以使用类

没有

除了帮助理解这个概念之外,你还必须理解伴侣对象的概念,它是一个与类同名的对象。

使用这个我们可以声明与class同名的对象,然后在那里声明静态成员。

例如在下面的代码我保持标题静态。

class HelloWorld(msg:String) {
    import HelloWorld._  //import static members

    def msg():String = {
        getHeader + msg //append static header
    }
}

object HelloWorld {  //companion object
  private def getHeader:String = "Hello, "  //static method

  def main(args: Array[String]) {
    val scalaObj = new HelloWorld("scala!")
    val pyObj = new HelloWorld("Python!") 

    println(scalaObj.msg)
    println(pyObj.msg)

  }
}

输出:

Hello, scala!
Hello, python!