以下 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 .如果你在初始化你的类时使用它,beforeAll()
还没有被调用,所以它仍然是 null。
总结一下,顺序是:
- 父类(super class)初始化(代码只在特征体中)
- 子类初始化(代码在你的类的主体中)
- beforeAll() 调用
- 测试运行
因此您可以在第 4 步中使用 sc
,但不能在第 2 步中使用。
关于scala - 当在 FunSuite 的测试函数之外使用 SharedSparkContext (sc) 时,是什么导致了 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46206202/