从应用程序扩展到scala中包含main方法的对象之间的差异



我编写了一个示例spark-scala程序,用于从数据帧创建json元素列表。当我使用main方法执行时,它返回空列表,但当我在没有扩展应用程序的对象的情况下执行时,返回包含记录的列表。扩展应用程序和scala对象中的主方法之间有什么区别

object DfToMap {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
.appName("Rnd")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val df = Seq(
(8, "bat"),
(64, "mouse"),
(27, "horse")
).toDF("number", "word")
val json = df.toJSON
val jsonArray = new util.ArrayList[String]()
json.foreach(f => jsonArray.add(f))
print(jsonArray)
}
}

它将返回空列表但下面的程序给了我记录的列表

object DfToMap extends App{
val spark: SparkSession = SparkSession.builder()
.appName("Rnd")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val df = Seq(
(8, "bat"),
(64, "mouse"),
(27, "horse")
).toDF("number", "word")
val json = df.toJSON
val jsonArray = new util.ArrayList[String]()
json.foreach(f => jsonArray.add(f))
print(jsonArray)
}

TL;DR这两个代码段都不是正确的Spark程序,但其中一个比另一个更不正确。

您犯了两个错误,这两个错误都在介绍Spark的材料中进行了解释。

  • 由于Spark的性质,它不支持扩展App的应用程序-快速启动-自包含应用程序

    请注意,应用程序应该定义main((方法,而不是扩展scala。应用程序。scala的子类。应用程序可能无法正常工作。

  • Spark不提供全局共享内存,因此不支持修改全局对象作为闭包-Spark编程指南-理解闭包

最新更新