spark-shell (scala) 上演的 SparkSession 变量是 val 还是 var?

Is the SparkSession variable staged by spark-shell (scala) a val or a var?

我正在尝试将我的 Spark Scala 脚本(用 spark-shell 编写)转换为 Scala Class、对象、方法 (def) 等,因此我为 spark-submit 创建了 JAR .我使用 Spark SQL 进行了很多调用,这些调用针对时区执行大量时间戳计算。我必须显式设置以下配置(因为每个分布式节点可能配置了不同的默认时区)以确保我的时区对于任何后续 Spark SQL 任何 Spark SQL 函数调用的时间戳操作始终是 UTC (代码块)在该方法中。

spark.conf.set("spark.sql.session.timeZone", "UTC")

如果该方法签名包括 (spark: org.apache.spark.sql.SparkSession) 作为参数,那么我总是可以从明确的代码语句开始,将时区设置为 UTC 到 SparkSession,而不会冒险(所有分布式 Spark 节点可能具有也可能不具有完全相同的时区配置)?

我的下一个问题是,如何确定 spark-shell 设置的 "spark" 变量是 val 还是 var?在寻找这个问题的答案时,我找到了这个 code snippet ,希望找出这个 Scala 变量是 immutable 还是 mutable。但它没有告诉我 Scala 变量 sparkvar 还是 val。在我将 spark.sql.session.timeZone 设置为 UTC 后,是否需要 return spark 返回到方法调用方,因为我在我的方法中修改了它?目前我的方法签名需要两个输入参数 (org.apache.spark.sql.SparkSession, org.apache.spark.sql.DataFrame) 并且输出是一个元组 (org.apache.spark.sql.SparkSession, org.apache.spark.sql.DataFrame).

scala> def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]
manOf: [T](t: T)(implicit evidence: Manifest[T])Manifest[T]

scala> manOf(List(1))
res3: Manifest[List[Int]] = scala.collection.immutable.List[Int]

scala> manOf(spark)
res2: Manifest[org.apache.spark.sql.SparkSession] = org.apache.spark.sql.SparkSession

额外的上下文: 作为启动 spark-shell 的一部分,变量 spark 初始化如下:

Spark context available as 'sc' (master = yarn, app id = application_1234567890_111111).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.4
      /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_REDACTED)
Type in expressions to have them evaluated.
Type :help for more information.

感谢 @Luis Miguel Mejía Suárez 为我提供答案和提示作为对我的问题的评论。我实施了以下实验,spark 是一个可变对象,我只是使用 spark 作为对方法外部和方法内部同一对象的相同引用。虽然这种不良副作用不是纯函数式实现,但它确实省去了我将 return 和 spark 对象返回给调用者进行其他后续处理的麻烦。如果其他人有更好的解决方案,请分享。

def x(spark: SparkSession, inputDF: DataFrame) = {
  import spark.implicits._
  spark.conf.set("spark.sql.session.timeZone", "UTC") // mutation of the object inside method

  //...spark.sql.functions...
  finalDF
}

启动 spark-shell 并执行了以下操作:

Spark context available as 'sc' (master = yarn, app id = application_1234567890_222222).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.4
      /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_REDACTED)
Type in expressions to have them evaluated.
Type :help for more information.

scala> spark.conf.get("spark.sql.session.timeZone")
res1: String = America/New_York

scala> :load x.scala
x: (spark: org.apache.spark.sql.SparkSession, inputDF: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame

scala> val timeConvertedDF = x(spark, inputDF)
timeConvertedDF: org.apache.spark.sql.DataFrame = [att1: timestamp, att2: string ... 25 more fields]

scala> spark.conf.get("spark.sql.session.timeZone")
res4: String = UTC