【问题标题】:Why does the Spark application code need to be an object rather than a class?为什么 Spark 应用程序代码需要是对象而不是类?
【发布时间】:2018-08-14 23:25:59
【问题描述】:

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

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

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

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

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

    是否可以使用类代替

    没有。

    除了帮助理解概念外,还要理解伴生对象的概念,它是一个与类同名的对象。

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

    例如在下面的代码中,我保持标题不变。

    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!
    

    【讨论】:

      【解决方案2】:

      这是 Scala 本身的问题,而不是 Spark。编译 Scala class 时,内部的方法不会转换为等效的 Java 静态方法。这意味着 main 方法将不是 static,因此 JVM 在执行程序时将无法找到它。相反,Scala object 中的所有方法都将是静态。可以在 here 找到对差异的很好解释。

      不可能只使用一个class,因为main 方法需要在object 中。但是,可以有一个 object 来简单地创建 class 的一个实例以及 class 中的所有其他代码 - 但是当您可以简单地将 class 变成 object 时,这似乎是不必要的而是。

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 2012-08-04
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多