当前位置: 首页 > 知识库问答 >
问题:

SparkShell(scala)暂存的SparkSession变量是val还是var?

华景明
2023-03-14

我正在尝试将Spark Scala脚本(用Spark shell编写)转换为Scala类、对象、方法(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?为了寻找这个问题的答案,我找到了这个代码片段,希望找出这个Scala变量是不可变的还是可变的。但它没有告诉我Scala变量sparkvar还是val。设置spark后是否需要将spark返回给方法调用方。sql。一场时区到UTC,因为我用我的方法修改了它?目前,我的方法签名需要两个输入参数(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$1: 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-shell的初始化如下:

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.

共有1个答案

卫逸春
2023-03-14

感谢@Luis Miguel Mejía Suárez为我提供了答案

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 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
 类似资料:
  • 问题内容: 我已经学习Python几个月了,对C语言的了解也很少,我想知道是否有人可以帮我解决这个疑问: 变量是名称,值还是存储位置? 例如: 变量x,x的值还是x在内存中的位置? 我正在寻找关于什么是变量的清晰解释。我已经看过Wikipedia上有关变量和此问题的页面,但对我来说都不是很清楚。如果这是一个重复的问题,那么指向正确答案的链接将非常有用。 谢谢! 问题答案: 语句发生了几件事: 创建

  • 问题内容: 好吧,我想我在这里有一个非常基本的疑问: 我正在开发基于GAE(Java)的应用程序,并对返回很多实体的数据存储区执行查询,因此需要对其进行缓存。我使用了内存缓存,并且运行良好,但是如果将实体列表保留在静态变量中,则整个请求的运行速度将比使用内存缓存快两倍。我认为这是因为我并没有一直对实体进行反序列化。 在memcache上使用静态变量代替的缺点是什么?我不知道云中是否可能有我的应用程

  • 问题内容: 在T-SQL中分配变量时,和语句之间有什么区别? 问题答案: Quote,本文总结如下: SET是用于变量分配的ANSI标准,而SELECT不是。 SET一次只能分配一个变量,SELECT可以一次进行多个分配。 3. 如果从查询分配,SET只能分配标量值。如果查询返回多个值/行,则SET将引发错误。SELECT会将值之一分配给变量,并隐藏返回了多个值的事实(因此您很可能永远都不知道为什

  • 问题内容: 我习惯在所有程序中广泛使用 静态变量 ,尤其是在使用Android时。我倾向于使用它们,因为有时 通过Intents发送10个或更多的值 会很 麻烦 。因此,我只是将 它们声明为静态 变量,并通过使用“点”运算符轻松地在其他类中访问它们。使用静态变量的另一个原因是当我要在整个应用程序中使用 Utility类时 。就像我在下面给出的代码一样,它可以帮助我 在不同的活动中使用变量 。 Ut

  • 问题内容: PHP变量是通过值还是通过引用传递? 问题答案: 根据PHP文档的价值。 默认情况下,函数参数是按值传递的(因此,如果函数中参数的值发生更改,则不会在函数外部进行更改)。要允许函数修改其参数,必须通过引用将其传递。 有一个参数总是通过引用传递函数,在前面加上符号( & ),以在函数定义的参数名称。

  • 主要内容:变量声明,变量类型声明,变量类型引用,Scala 多个变量声明变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。 变量声明 在学习如何声明变量与常量之前,我们先来了解一些变量与常量。 一、变量: 在程序运行过程中其值可能发生改变的量叫做变量。如:时间,年龄。 二、常量 在