मैं बॉयलरप्लेट कोड को init और स्पार्क सत्र को नष्ट करने से बचने के लिए ScalaTest FunSuite परीक्षण को दोबारा करने का प्रयास करता हूं।

समस्या यह है कि मुझे आयात निहित कार्यों की आवश्यकता है लेकिन दृष्टिकोण से पहले/बाद में केवल चर (var फ़ील्ड) का उपयोग किया जा सकता है, और इसे आयात करने के लिए एक मान (वैल फ़ील्ड) आवश्यक है।

विचार प्रत्येक परीक्षण निष्पादन के लिए एक नया स्वच्छ स्पार्क सत्र आयोजित करने का है।

मैं ऐसा कुछ करने की कोशिश करता हूं:

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._ मुझे एक त्रुटि है

प्रतीक sqlContext को हल नहीं कर सकता

इस समस्या को कैसे हल करें या परीक्षण वर्ग को कैसे लागू करें?

6
angelcervera 11 जिंदा 2017, 18:29

2 जवाब

स्पार्क संदर्भ के लिए एक नया अपरिवर्तनीय चर परिभाषित करें और इम्प्लीकेट आयात करने से पहले इसे 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 ...
  }
}
1
Boris 8 फरवरी 2017, 17:06
1
आपको परीक्षण के दौरान स्पार्क सत्र के जीवन-चक्र का प्रबंधन नहीं करना चाहिए। कृपया SharedSparkContext का उपयोग करें (github.com/apache/spark/blob/master/core/src/test/scala/org/…)।
 – 
mahmoud mehdi
6 अगस्त 2018, 18:41
क्या आप मुझे "साझा स्पार्क सत्र" के लिए मेवेन निर्भरताओं को बता सकते हैं
 – 
Sampat Kumar
11 नवम्बर 2019, 09:25

आप spark-testing-base का भी इस्तेमाल कर सकते हैं, जो सभी बॉयलरप्लेट कोड को काफी हद तक हैंडल करता है। .

यह रहा a ब्लॉग पोस्ट क्रिएटर द्वारा, इसका उपयोग करने का तरीका बताते हुए।

और यहां उनके wiki से एक सरल उदाहरण दिया गया है:

class test extends FunSuite with DatasetSuiteBase {
  test("simple test") {
    val sqlCtx = sqlContext
    import sqlCtx.implicits._

    val input1 = sc.parallelize(List(1, 2, 3)).toDS
    assertDatasetEquals(input1, input1) // equal

    val input2 = sc.parallelize(List(4, 5, 6)).toDS
    intercept[org.scalatest.exceptions.TestFailedException] {
        assertDatasetEquals(input1, input2) // not equal
    }
  }
}
1
Eyal 9 अगस्त 2018, 09:39