有点帮助的事情是在class
or object
而不是每个函数。对于“文件 A”和“文件 B”示例:
File A
class A {
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
def job() = {
//create dataset ds
val b = new B(spark)
b.doSomething(ds)
doSomething(ds)
}
private def doSomething(ds: Dataset[Foo]) = {
ds.map(e => 1)
}
}
File B
class B(spark: SparkSession) {
import spark.implicits._
def doSomething(ds: Dataset[Foo]) = {
ds.map(e => "SomeString")
}
}
通过这种方式,您可以获得可管理的数量imports
.
不幸的是,据我所知,没有其他方法可以进一步减少进口数量。这是由于需要SparkSession
实际执行时的对象import
。因此,这是可以做的最好的事情。
Update:
更方便的方法是创建一个 ScalaTrait
并将其与空的组合Object
。这允许在每个文件的顶部轻松导入隐式,同时允许扩展特征以使用SparkSession
目的。
Example:
trait SparkJob {
val spark: SparkSession = SparkSession.builder.
.master(...)
.config(..., ....) // Any settings to be applied
.getOrCreate()
}
object SparkJob extends SparkJob {}
这样我们就可以对文件 A 和 B 执行以下操作:
File A:
import SparkJob.spark.implicits._
class A extends SparkJob {
spark.sql(...) // Allows for usage of the SparkSession inside the class
...
}
File B:
import SparkJob.spark.implicits._
class B extends SparkJob {
...
}
请注意,只需扩展SparkJob
对于使用的类或对象spark
对象本身。