【问题标题】:Not able to import Spark Implicits in ScalaTest无法在 ScalaTest 中导入 Spark Implicits
【发布时间】:2017-10-21 00:05:59
【问题描述】:

我正在使用 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

我无法理解为什么我不能在测试套件中import spark.implicits._

感谢任何帮助!

【问题讨论】:

  • 这是因为您将SparkSession 定义为var。将其定义为 valtransformingval 应该可以工作。

标签: scala apache-spark apache-spark-sql implicit scalatest


【解决方案1】:

如错误消息所述,要进行导入,您需要一个“稳定标识符”。这意味着您需要有一个 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 时表现异常。你知道背后的原因吗?
  • 与 SparkSession 无关。 SparkSession 的行为完全正常。这是导入的问题。导入需要一个稳定的标识符。稳定的标识符可以是 val 但不能是 var 或 def
  • 哦...好的!不知道:)
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2016-02-05
  • 1970-01-01
  • 2018-01-30
  • 2022-01-05
相关资源
最近更新 更多