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 变量 spark
是 var
还是 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
我正在尝试将我的 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 变量 spark
是 var
还是 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