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

标签 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?

最佳答案

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。

总结一下,顺序是:

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

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

关于scala - 当在 FunSuite 的测试函数之外使用 SharedSparkContext (sc) 时,是什么导致了 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46206202/

相关文章:

scala - 在 Scalatest 和 Argonaut.io 中导致编译失败的模糊隐式转换

scala - 为什么我们需要 Future 和 Promise?

scala - Scala Koans 中的 ===(三等号)运算符是什么?

apache-spark - Spark - GraphX - 缩放连接组件

scala - 如何在 Scalatest 中禁用测试?

scalatest - 我如何让类里面的每个测试自动标记一个特定的标签

scala - 使用spark-csv写入单个CSV文件

sql - 如何在 FROM 语句上使用 header 加载 SparkSQL

python - Spark SQL : TypeError ("StructType can not accept object in type %s" % type(obj))

hadoop - 为集群创建 Spark 环境