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
作为其aval
。您可以随时传递到不同的类,以便它们访问
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()