我刚接触scala和spark,目前正在从事scala-spark-jobs项目,有一件事让我很沮丧,那就是我不知道如何像用java那样用intellij调试代码。
导入scala项目后,我注意到spark jobs文件夹没有标记为source code文件夹,即使同一模块中的其他子文件夹也被标记为source code文件夹。
-- 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作业,没有main方法。
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
)
}
不过,在“app”中定义了一个main方法
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'
这和java有很大的不同,有人能告诉我如何调试它吗?
3条答案
按热度按时间bqujaahr1#
在scala中,定义主类有不同的方法。一种是在
object
,类似于java。另一个是延长App
trait,只需将应用程序代码直接写入类中,就像DailyExport
在你的例子中。因此,您应该能够正常地将该类作为主类运行,并且还应该在intellij中的类旁边看到一个“run”图标(而不是超级类中的main方法,这是App
特征)。如果以这种方式运行,但仍然出现错误,则可能是在intellij中遇到了错误。尝试再次运行它,可能是在切换窗口并检查编译输出是否正确后。
mqxuamgl2#
请检查intellij生成的目标文件夹。确保保持包结构。
如果问题仍然存在,请尝试执行干净的构建。
4ngedf3f3#
intellijidea有自己的调试scala的调试器。您可以使用intellijidea调试器或sbtshell来调试问题。
更多信息在这里。