当在 FunSuite 的测试函数之外使用 SharedSparkContext (sc) 时,是什么导致了 NullPointerException?
What causes a NullPointerException when a SharedSparkContext (sc) is used outside a test function in FunSuite?
以下 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?
SparkContext 在 SharedSparkContext 中声明,但未作为该特征初始化的一部分进行初始化。相反,它是在特征的 beforeAll()
方法中初始化的,该方法在套件完全实例化后由测试框架调用。来源在这里:https://github.com/holdenk/spark-testing-base/blob/master/src/main/pre-2.0/scala/com/holdenkarau/spark/testing/SharedSparkContext.scala。如果你在初始化你的 class 时使用它,beforeAll()
还没有被调用,所以它仍然是空的。
总结一下,顺序是:
- 超级class初始化(代码只是在trait body中)
- Sub-class 初始化(代码就在你 class 的正文中)
- beforeAll() 调用
- 测试运行
因此您可以在第 4 步中使用 sc
,但不能在第 2 步中使用。
以下 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?
SparkContext 在 SharedSparkContext 中声明,但未作为该特征初始化的一部分进行初始化。相反,它是在特征的 beforeAll()
方法中初始化的,该方法在套件完全实例化后由测试框架调用。来源在这里:https://github.com/holdenk/spark-testing-base/blob/master/src/main/pre-2.0/scala/com/holdenkarau/spark/testing/SharedSparkContext.scala。如果你在初始化你的 class 时使用它,beforeAll()
还没有被调用,所以它仍然是空的。
总结一下,顺序是:
- 超级class初始化(代码只是在trait body中)
- Sub-class 初始化(代码就在你 class 的正文中)
- beforeAll() 调用
- 测试运行
因此您可以在第 4 步中使用 sc
,但不能在第 2 步中使用。