ang*_*era 6 scala scalatest apache-spark
我尝试重构ScalaTest FunSuite测试,以避免样板代码初始化并销毁Spark会话.
问题是我需要导入隐式函数,但使用前/后方法只能使用变量(var字段),并且导入它是必要的值(val字段).
我们的想法是在每次测试执行时都有一个新的干净的Spark Session.
我尝试做这样的事情:
import org.apache.spark.SparkContext
import org.apache.spark.sql.{SQLContext, SparkSession}
import org.scalatest.{BeforeAndAfter, FunSuite}
object SimpleWithBeforeTest extends FunSuite with BeforeAndAfter {
var spark: SparkSession = _
var sc: SparkContext = _
implicit var sqlContext: SQLContext = _
before {
spark = SparkSession.builder
.master("local")
.appName("Spark session for testing")
.getOrCreate()
sc = spark.sparkContext
sqlContext = spark.sqlContext
}
after {
spark.sparkContext.stop()
}
test("Import implicits inside the test 1") {
import sqlContext.implicits._
// Here other stuff
}
test("Import implicits inside the test 2") {
import sqlContext.implicits._
// Here other stuff
}
Run Code Online (Sandbox Code Playgroud)
但在线上import sqlContext.implicits._我有一个错误
无法解析符号sqlContext
如何解决此问题或如何实现测试类?
为 Spark 上下文定义一个新的不可变变量,并在导入隐式之前将 var 分配给它。
class MyCassTest extends FlatSpec with BeforeAndAfter {
var spark: SparkSession = _
before {
val sparkConf: SparkConf = new SparkConf()
spark = SparkSession.
builder().
config(sparkConf).
master("local[*]").
getOrCreate()
}
after {
spark.stop()
}
"myFunction()" should "return 1.0 blab bla bla" in {
val sc = spark
import sc.implicits._
// assert ...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |