Importing spark.implicits._ in scala

前端 未结 8 1164
感情败类
感情败类 2020-12-25 09:33

I am trying to import spark.implicits._ Apparently, this is an object inside a class in scala. when i import it in a method like so:

def f() = {
  val spark          


        
8条回答
  •  感情败类
    2020-12-25 10:12

    Thanks to @bluenote10 for helpful answer and we can simplify it again, for example without helper object testImplicits:

    private object testImplicits extends SQLImplicits {
      protected override def _sqlContext: SQLContext = self.spark.sqlContext
    }
    

    with following way:

    trait SharedSparkSession extends BeforeAndAfterAll { self: Suite =>
    
      /**
       * The SparkSession instance to use for all tests in one suite.
       */
      private var spark: SparkSession = _
    
      /**
       * Returns local running SparkSession instance.
       * @return SparkSession instance `spark`
       */
      protected def sparkSession: SparkSession = spark
    
      /**
       * A helper implicit value that allows us to import SQL implicits.
       */
      protected lazy val sqlImplicits: SQLImplicits = self.sparkSession.implicits
    
      /**
       * Starts a new local spark session for tests.
       */
      protected def startSparkSession(): Unit = {
        if (spark == null) {
          spark = SparkSession
            .builder()
            .master("local[2]")
            .appName("Testing Spark Session")
            .getOrCreate()
        }
      }
    
      /**
       * Stops existing local spark session.
       */
      protected def stopSparkSession(): Unit = {
        if (spark != null) {
          spark.stop()
          spark = null
        }
      }
    
      /**
       * Runs before all tests and starts spark session.
       */
      override def beforeAll(): Unit = {
        startSparkSession()
        super.beforeAll()
      }
    
      /**
       * Runs after all tests and stops existing spark session.
       */
      override def afterAll(): Unit = {
        super.afterAll()
        stopSparkSession()
      }
    }
    

    and finally we can use SharedSparkSession for unit tests and import sqlImplicits:

    class SomeSuite extends FunSuite with SharedSparkSession {
      // We can import sql implicits 
      import sqlImplicits._
    
      // We can use method sparkSession which returns locally running spark session
      test("some test") {
        val df = sparkSession.sparkContext.parallelize(List(1,2,3)).toDF()
        //...
      }
    }
    

提交回复
热议问题