我编写了示例spark-scala程序,用于从数据帧创建json元素列表。当我执行main方法时,它返回空列表,但是当我执行不扩展对象的应用程序时,它返回包含记录的列表。 Scala对象中extends App和main方法有什么区别
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)
}
答案 0 :(得分:2)
TL; DR 这两个代码片段都不是正确的Spark程序,但是其中一个比另一个更不正确。
您犯了两个错误,都在Spark入门资料中进行了解释。
由于其性质,Spark不支持扩展App
-Quick Start - Self-Contained Applications
请注意,应用程序应定义main()方法,而不是扩展scala.App。 scala.App的子类可能无法正常工作。
Spark不提供全局共享内存,因此不支持关闭闭包对象来修改全局对象-Spark Programming Guide - Understanding Closures