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

sha*_*neb 2 scala scalatest apache-spark

以下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))
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,以下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)
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*e K 5

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

总而言之,订单是:

  1. 超类初始化(仅在特征体中的代码)
  2. 子类初始化(代码只在你班级的主体中)
  3. beforeAll()调用
  4. 测试运行

因此,您可以sc在步骤4中使用,但不能在步骤2中使用.