web-dev-qa-db-fra.com

Impossible d'importer Spark Implicits dans ScalaTest

J'écris des cas de test pour Spark en utilisant ScalaTest.

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()
  }
}

Lorsque j'essaie de compiler la suite de tests, cela me donne l'erreur suivante:

stable identifier required, but ClassNameSpec.this.spark.implicits found.
[error]     import spark.implicits._
[error]                  ^
[error] one error found
[error] (test:compileIncremental) Compilation failed

Je n'arrive pas à comprendre pourquoi je ne peux pas import spark.implicits._ dans une suite de tests.

Toute aide est appréciée!

13
himanshuIIITian

Pour effectuer une importation, vous avez besoin d'un "identifiant stable" comme l'indique le message d'erreur. Cela signifie que vous devez avoir un val, pas un var. Puisque vous avez défini spark comme var, scala ne peut pas importer correctement.

Pour résoudre ce problème, vous pouvez simplement faire quelque chose comme:

val spark2 = spark
import spark2.implicits._

ou remplacez plutôt la var d'origine par val, par exemple:

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