【问题标题】:How to implement a ScalaTest FunSuite to avoid boilerplate Spark code and import implicits如何实现 ScalaTest FunSuite 以避免样板 Spark 代码和导入隐式
【发布时间】:2017-01-11 15:29:25
【问题描述】:

我尝试重构 ScalaTest FunSuite 测试以避免样板代码初始化和破坏 Spark 会话。

问题是我需要导入隐式函数,但使用 before/after 方法只能使用变量(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
  }

但是在import sqlContext.implicits._这行我有一个错误

无法解析符号 sqlContext

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

【问题讨论】:

    标签: scala apache-spark scalatest


    【解决方案1】:

    您也可以使用spark-testing-base,它几乎可以处理所有样板代码。

    这里是作者a blog post,解释如何使用它。

    这是来自他们wiki的一个简单示例:

    类测试用 DatasetSuiteBase 扩展 FunSuite { 测试(“简单测试”){ val sqlCtx = sqlContext 导入 sqlCtx.implicits._ val input1 = sc.parallelize(List(1, 2, 3)).toDS assertDatasetEquals(input1, input1) // 相等 val input2 = sc.parallelize(List(4, 5, 6)).toDS 拦截[org.scalatest.exceptions.TestFailedException] { assertDatasetEquals(input1, input2) // 不等于 } } }

    【讨论】:

      【解决方案2】:

      为 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 ...
        }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多