web-dev-qa-db-ja.com

インポートできませんSpark 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 = _

  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._テストスイートで。

どんな助けでもありがたいです!

13
himanshuIIITian

インポートを行うには、エラーメッセージにあるように「安定した識別子」が必要です。これは、varではなくvalが必要であることを意味します。 sparkを変数として定義したため、scalaは正しくインポートできません。

これを解決するには、次のようにします。

val spark2 = spark
import spark2.implicits._

または、代わりに元のvarをvalに変更します。例:

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