当在FunSuite中的测试函数外部使用SharedSparkContext(sc)时,是什么导致NullPointerException?

时间:2017-09-13 20:20:24

标签: scala apache-spark scalatest

以下scala代码工作正常,测试运行:

import org.scalatest._
import com.holdenkarau.spark.testing._

class DummyTest extends FunSuite with SharedSparkContext {
   test("shared context only works inside test functions.") {
     val myRDD = sc.parallelize(List(1,2,3,4))
   }
}

但是,以下scala代码导致sc.parallelize行上的java.lang.NullPointerException:

import org.scalatest._
import com.holdenkarau.spark.testing._

class DummyTest extends FunSuite with SharedSparkContext {
   val myRDD = sc.parallelize(List(1,2,3,4))
   test("shared context only works inside test functions.") {
      assert(true)
   }
}

在测试函数之外使用SparkContext时,导致NullPointerException的原因是什么?

1 个答案:

答案 0 :(得分:5)

SparkContext在SharedSparkContext中声明,但未作为该特征初始化的一部分进行初始化。而是在特征的beforeAll()方法中初始化,该方法在套件完全实例化后由测试框架调用。来源在这里:https://github.com/holdenk/spark-testing-base/blob/master/src/main/pre-2.0/scala/com/holdenkarau/spark/testing/SharedSparkContext.scala。如果您在初始化课程时使用它,则尚未调用beforeAll(),因此它仍然为空。

总而言之,订单是:

  1. 超类初始化(仅在特征体中的代码)
  2. 子类初始化(代码只在你班级的代码中)
  3. beforeAll()调用
  4. 测试运行
  5. 因此,您可以在步骤4中使用sc,但不能在步骤2中使用。