2017-01-11 4 views
6

Sparkセッションを初期化して破壊する定型コードを避けるために、ScalaTest FunSuiteテストをリファクタリングしようとしています。定型句を避けるためにScalaTest FunSuiteを実装する方法Sparkコードとインポートのimplicits

問題は、暗黙の関数をインポートする必要がありますが、前/後のアプローチでは変数(varフィールド)のみを使用でき、インポートするには値(valフィールド)が必要です。

アイデアは、テスト実行ごとに新しいクリーンなスパークセッションを持つことです。

はシンボルがこの問題を解決する方法

をsqlContext解決できません

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 
    } 

しかしラインimport sqlContext.implicits._に私がエラーを持っている:

私はこのような何かをしようまたはテストクラスを実装する方法は?

答えて

1

sparkコンテキストの新しい不変変数を定義し、implicをインポートする前にvarを代入します。

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 ... 
    } 
} 
関連する問題