2017-01-11 41 views
6

Próbuję refakturować test ScalaTest FunSuite, aby uniknąć kodu na płycie, aby zainicjować i zniszczyć sesję Spark.Jak zaimplementować ScalaTest FunSuite, aby uniknąć bojlerów Kod Spark i implikowanie implikacji

Problem polega na tym, że potrzebuję funkcji niejawnych importu, ale używając podejścia przed/po można stosować tylko zmienne (pola var), a do importowania konieczna jest wartość (pola val).

Chodzi o to, aby każda sesja testowa miała nową czystą sesję Spark.

staram się zrobić coś takiego:

import org.apache.spark.SparkContext 
import org.apache.spark.sql.{SQLContext, SparkSession} 
import org.scalatest.{BeforeAndAfter, FunSuite} 

object SimpleWithBeforeTest extends FunSuite with BeforeAndAfter { 

    var spark: SparkSession = _ 
    var sc: SparkContext = _ 
    implicit var sqlContext: SQLContext = _ 

    before { 
    spark = SparkSession.builder 
     .master("local") 
     .appName("Spark session for testing") 
     .getOrCreate() 
    sc = spark.sparkContext 
    sqlContext = spark.sqlContext 
    } 

    after { 
    spark.sparkContext.stop() 
    } 

    test("Import implicits inside the test 1") { 
    import sqlContext.implicits._ 

    // Here other stuff 
    } 

    test("Import implicits inside the test 2") { 
    import sqlContext.implicits._ 

    // Here other stuff 
    } 

Ale w linii import sqlContext.implicits._ mam błąd

Nie można rozwiązać symbol SqlContext

Jak rozwiązać ten problem lub jak zaimplementować klasę testów?

Odpowiedz

1

Zdefiniuj nową niezmienną zmienną dla kontekstu iskry i przypisz ją var przed importowaniem implikacji.

class MyCassTest extends FlatSpec with BeforeAndAfter { 

    var spark: SparkSession = _ 

    before { 
    val sparkConf: SparkConf = new SparkConf()  
    spark = SparkSession. 
     builder(). 
     config(sparkConf). 
     master("local[*]"). 
     getOrCreate() 
    } 

    after { 
    spark.stop() 
    } 

    "myFunction()" should "return 1.0 blab bla bla" in { 
    val sc = spark 
    import sc.implicits._ 

    // assert ... 
    } 
}