Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在代码的任何位置获取当前SparkSession?_Scala_Apache Spark - Fatal编程技术网

Scala 如何在代码的任何位置获取当前SparkSession?

Scala 如何在代码的任何位置获取当前SparkSession?,scala,apache-spark,Scala,Apache Spark,我在main()函数中创建了一个会话,如下所示: val sparkSession = SparkSession.builder.master("local[*]").appName("Simple Application").getOrCreate() 现在,如果我想配置应用程序或访问属性,我可以在同一个函数中使用局部变量sparkSession 如果我想在同一个项目的其他地方访问此sparkSession,比如project/module/../…/xxx.scala,该怎么办。当Spar

我在
main()
函数中创建了一个会话,如下所示:

val sparkSession = SparkSession.builder.master("local[*]").appName("Simple Application").getOrCreate()
现在,如果我想配置应用程序或访问属性,我可以在同一个函数中使用局部变量
sparkSession


如果我想在同一个项目的其他地方访问此
sparkSession
,比如
project/module/../…/xxx.scala
,该怎么办。当
SparkSession
变量被定义为

val sparkSession = SparkSession.builder.master("local[*]").appName("Simple Application").getOrCreate()
此变量将
指向/仅引用一个
SparkSession
作为其a
val
。您可以随时传递到不同的类,以便它们访问

val newClassCall = new NewClass(sparkSession)

现在,您也可以在该新类中使用相同的
sparkSession

创建会话后(在任何位置),您可以安全地使用:

SparkSession.builder().getOrCreate()

获取代码中任何位置的(相同)会话,只要该会话仍处于活动状态。Spark保持单个活动会话,因此除非它停止或崩溃,否则您将获得相同的会话

由于2.2.0您可以通过以下方式访问活动SparkSession

/**
 * Returns the active SparkSession for the current thread, returned by the builder.
 *
 * @since 2.2.0
 */
def getActiveSession: Option[SparkSession] = Option(activeThreadSession.get)
默认SparkSession

/**
 * Returns the default SparkSession that is returned by the builder.
 *
 * @since 2.2.0
 */
def getDefaultSparkSession: Option[SparkSession] = Option(defaultSession.get)

这是一个老生常谈的问题,有几个答案足够好,但我想再给出一个方法,可以用来让它工作

您可以创建一个从serializable扩展而来的特性,并将spark会话创建为惰性变量,然后在您创建的所有对象中完成项目,您可以扩展该特性,它将为您提供sparksession实例

代码如下:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.DataFrame
trait SparkSessionWrapper extends Serializable {
  lazy val spark: SparkSession = {
    SparkSession.builder().appName("TestApp").getOrCreate()
  }
//object with the main method and it extends SparkSessionWrapper 
object App extends SparkSessionWrapper {
 def main(args: Array[String]): Unit = {
   val readdf = ReadFileProcessor.ReadFile("testpath")
   readdf.createOrReplaceTempView("TestTable")
   val viewdf = spark.sql("Select * from TestTable")
 }
}

object ReadFileProcessor extends SparkSessionWrapper{
 def ReadFile(path: String) : DataFrame = {
  val df = spark.read.format("csv").load(path)
  df
 }
}

当您在创建的两个对象上扩展SparkSessionWrapper时,当代码中第一次遇到spark变量时,spark会话将被初始化,然后您在扩展该特性的任何对象上引用它,而不将其作为参数传递给该方法。它的工作原理或给你类似笔记本电脑的体验。

你在哪里创建sparkSession?到目前为止,您从xxx.scala访问sparkSession的尝试是什么?您能否在main对象的main函数中分享更多关于您共享sparkSession的用例的信息?@hadooper。我不知道我是否使用
getOrCreate()
将获得相同的会话或not@BDR我想在其他地方使用
setLocalProperty
。正如我在main函数中定义的会话一样,idk知道如何在function@PC9527您是否希望创建会话后setLocalProperty会产生影响?在这种情况下,如果我已将其传递给其他类,为什么我仍然需要一个新类(而它们是相同的sparkSession)?喜欢'def f1(ss:SparkSession)=//使用ss做某事。我正在将SparkSession作为参数传递给新类。你的意思是当你实例化一个类时?但是以这种方式,会话就像类的一个成员,idk是否合适。是
activeThreadSession
defaultSession
SparkSession的私有成员?当我试图在笔记本中使用它们时,出现了
错误:无法在object org.apache.spark.sql中访问object SparkSession中的值defaultSession。SparkSession
builder
不可调用。使用SparkSession.builder.getOrCreate()