2016-09-09 35 views
1

我試圖在火花運行多個單元測試和已經複製(和稍微適應)從所述源代碼中的位:單元測試implicits

import org.apache.spark.sql.SQLContext 
import org.apache.spark.{SparkConf, SparkContext} 
import org.scalatest.{BeforeAndAfterAll, Suite} 

trait SharedSparkContext extends BeforeAndAfterAll { 
    self: Suite => 

    @transient private var _sc: SparkContext = _ 
    @transient private var _sqlContext: SQLContext = _ 

    def sc: SparkContext = _sc 
    def sqlContext: SQLContext = _sqlContext 

    private var conf = new SparkConf(false) 

    override def beforeAll() { 
    super.beforeAll() 
    _sc = new SparkContext("local[*]", "Test Suites", conf) 
    _sqlContext = new SQLContext(_sc) 
    } 

    override def afterAll() { 
    try { 
     LocalSparkContext.stop(_sc) 
     _sc = null 
    } finally { 
     super.afterAll() 
    } 
    } 
} 

的LocalSparkContext類伴侶對象是隻需從源文件複製即可。

我想過使用它,如下所示,它告訴我,stable identifier required因爲defsqlContext沒有成員implicits

class MySuite extends FlatSpec with SharedSparkContext { 
    import sqlContext.implicits._ 
    // ... 
} 

我曾嘗試用下面的替換它,但給我的空指針例外:

class MySuite extends FlatSpec with SharedSparkContext { 
    val sqlCtxt = sqlContext 
    import sqlCtxt.implicits._ 
    // ... 
} 

我使用星火1.4.1。我將parallelExecution in test := false

如何讓這個工作(不使用額外的軟件包)?

回答

2

而不是使用一個特點,你可以使用一個簡單的對象包含所有的變量,這就是我對我的測試做:

object TestConfiguration extends Serializable { 

    private val sparkConf = new SparkConf() 
     .setAppName("Tests") 
     .setMaster("local") 

    private lazy val sparkContext = new SparkContext(sparkConf) 

    private lazy val sqlContext = new SQLContext(sparkContext) 

    def getSqlContext() = { 
    sqlContext 
    } 

} 

然後,你就可以使用sqlContext在測試套件。

class MySuite extends FlatSpec with SharedSparkContext { 
    val sqlCtxt = TestConfiguration.getSqlContext 
    import sqlCtxt.implicits._ 
    // ... 
} 
+0

這樣,我得到了星火環境值,但一)我不能在配置混合和b)我不能讓配置關閉SparkContext後,所有的測試已運行。它的作品,但它不漂亮。 – Ian