मैं बॉयलरप्लेट कोड को 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 को हल नहीं कर सकता
इस समस्या को कैसे हल करें या परीक्षण वर्ग को कैसे लागू करें?
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 ...
}
}
आप 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 } } }