如何实现ScalaTest FunSuite以避免样板Spark代码和导入含义

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

如何解决此问题或如何实现测试类?

Bor*_*ris 1

为 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)