无法将其导入ScalaTest中

无法将其导入ScalaTest中,scala,apache-spark,apache-spark-sql,implicit,scalatest,Scala,Apache Spark,Apache Spark Sql,Implicit,Scalatest,我正在使用ScalaTest为Spark编写测试用例 import org.apache.spark.sql.SparkSession import org.scalatest.{BeforeAndAfterAll, FlatSpec} class ClassNameSpec extends FlatSpec with BeforeAndAfterAll { var spark: SparkSession = _ var className: ClassName = _ over

我正在使用ScalaTest为Spark编写测试用例

import org.apache.spark.sql.SparkSession
import org.scalatest.{BeforeAndAfterAll, FlatSpec}

class ClassNameSpec extends FlatSpec with BeforeAndAfterAll {
  var spark: SparkSession = _
  var className: ClassName = _

  override def beforeAll(): Unit = {
    spark = SparkSession.builder().master("local").appName("class-name-test").getOrCreate()
    className = new ClassName(spark)
  }

  it should "return data" in {
    import spark.implicits._
    val result = className.getData(input)

    assert(result.count() == 3)
  }

  override def afterAll(): Unit = {
    spark.stop()
  }
}
当我尝试编译测试套件时,它会给我以下错误:

stable identifier required, but ClassNameSpec.this.spark.implicits found.
[error]     import spark.implicits._
[error]                  ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
我无法理解为什么无法在测试套件中导入spark.implicits.\uu


感谢您的帮助

要进行导入,您需要一个稳定的标识符,如错误消息所示。这意味着您需要一个val,而不是var。 由于您将spark定义为var,scala无法正确导入

要解决此问题,您只需执行以下操作:

val spark2 = spark
import spark2.implicits._
或者将原始var更改为val,例如:

lazy val spark: SparkSession = SparkSession.builder().master("local").appName("class-name-test").getOrCreate()

这是因为您已将SparkSession定义为var。将其定义为val或转换为val应该可以工作。谢谢!!!这对我有用!但奇怪的是,SparkSession在定义为var时表现得很奇怪。你知道它背后的原因吗?它与SparkSession无关。SparkSession的行为完全正常。这是一个进口问题。导入需要一个稳定的标识符。稳定的标识符可以是val,但不能是var或defOh…好的!我不知道: