如何在intelliJ中调试scala spark代码

如何在intelliJ中调试scala spark代码,scala,intellij-idea,Scala,Intellij Idea,我是Scala和Spark的新手,目前正在从事Scala Spark jobs项目,有一件事让我感到沮丧,那就是我不知道如何像使用java那样用IntelliJ调试代码 导入scala项目后,我注意到spark jobs文件夹没有标记为源代码文件夹,即使同一模块中的其他子文件夹也被标记为源代码文件夹 -- utility (marked as source code folder) -- event-sender (marked as source code folder) -- s

我是Scala和Spark的新手,目前正在从事Scala Spark jobs项目,有一件事让我感到沮丧,那就是我不知道如何像使用java那样用IntelliJ调试代码

导入scala项目后,我注意到spark jobs文件夹没有标记为源代码文件夹,即使同一模块中的其他子文件夹也被标记为源代码文件夹

-- utility (marked as source code folder)
   -- event-sender (marked as source code folder)
   -- spark-jobs (not marked as source code folder)
      -- src
         --main
           -- resources
           -- scala
              -- com
                -- example
                   -- spark
                      -- jobs
当我检查我正在进行的spark作业时,没有主要方法

class DailyExport(
    env: String,
    )(implicit sc: SparkContext, sqlContext: SQLContext, logger: SparkJobLogger)
    extends JobAudit
    with PartitionedWriter {

  def run(): Unit = ...

object DailyExport extends App with SparkJobParameters {

  {
    for {
      env          <- getStringParameter("environment", 0, args)
    } yield {
      val jobConfig               = SparkJobConfig.fromConfig.exportConfig
      ...

      new DailyExport(
        jobConfig = jobConfig
      ).run()
    }
  }.fold(
    error => {
      println(s"Some provided parameters are wrong: $error")
      sys.exit(-1)
    },
    identity
  )
}

这与Java非常不同,有人能告诉我如何调试它吗

在Scala中,定义主类有不同的方法。一种是在对象中定义主方法,类似于Java。另一种方法是扩展apptrait,只需将应用程序代码直接写入类中,就像示例中DailyExport所做的那样。因此,您应该能够将该类作为主类正常运行,并且您还应该在IntelliJ中看到该类旁边的run图标,而不是超级类中的main方法,这是应用程序特性的实现细节


如果您以这种方式运行它,但仍然会出现错误,那么您可能在IntelliJ中遇到了错误。尝试再次运行它,可能是在切换窗口并检查编译输出是否正确后。

请检查IntelliJ生成的目标文件夹。确保维护包结构


如果问题仍然存在,请尝试执行干净的生成。

IntelliJ IDEA有自己的调试scala的调试器。您可以使用INTELLIJ IDEA调试器或sbt shell来调试问题

更多信息是

trait App extends DelayedInit {
...
@deprecatedOverriding("main should not be overridden", "2.11.0")
  def main(args: Array[String]) = {
    this._args = args
    for (proc <- initCode) proc()
    if (util.Properties.propIsSet("scala.time")) {
      val total = currentTime - executionStart
      Console.println("[total " + total + "ms]")
    }
  }
'Error: Could not find or load main class com.exmaple.spark.jobs.DailyExport'