2017-01-11 1 views
6

J'essaie de refactoriser un test ScalaTest FunSuite pour éviter que le code standard ne devienne init et ne détruise la session Spark. Le problème est que j'ai besoin d'importer des fonctions implicites mais en utilisant des variables d'approche avant/après seulement (champs var) peut être utilisé, et pour l'importer il faut une valeur (champs val).Comment implémenter un ScalaTest FunSuite pour éviter la propagation d'un code Spark et importer des implicites

L'idée est d'avoir une nouvelle session Spark propre à chaque exécution de test.

J'essaie de faire quelque chose comme ceci:

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 
    } 

Mais dans la ligne import sqlContext.implicits._ je une erreur

ne peut pas résoudre le symbole SqlContext

Comment résoudre ce problème ou comment implémenter la classe de tests?

Répondre

1

Définissez une nouvelle variable immuable pour le contexte d'étincelle et affectez-lui le var avant d'importer des implicits.

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 ... 
    } 
}