Подтвердить что ты не робот

Импорт spark.implicits._ в scala

Я пытаюсь импортировать spark.implicits._ По-видимому, это объект внутри класса в scala. когда я импортирую его в такой метод:

def f() = {
  val spark = SparkSession()....
  import spark.implicits._
}

Он отлично работает, однако я пишу тестовый класс, и я хочу сделать этот импорт доступным для всех тестов Я пробовал:

class SomeSpec extends FlatSpec with BeforeAndAfter {
  var spark:SparkSession = _

  //This won't compile
  import spark.implicits._

  before {
    spark = SparkSession()....
    //This won't either
    import spark.implicits._
  }

  "a test" should "run" in {
    //Even this won't compile (although it already looks bad here)
    import spark.implicits._

    //This was the only way i could make it work
    val spark = this.spark
    import spark.implicits._
  }
}

Не только это выглядит плохо, я не хочу делать это для каждого теста Каков "правильный" способ сделать это?

4b9b3361

Ответ 1

Я думаю, что код GitHub в файле SparkSession.scala может дать вам хороший совет:

      /**
       * :: Experimental ::
       * (Scala-specific) Implicit methods available in Scala for converting
       * common Scala objects into [[DataFrame]]s.
       *
       * {{{
       *   val sparkSession = SparkSession.builder.getOrCreate()
       *   import sparkSession.implicits._
       * }}}
       *
       * @since 2.0.0
       */
      @Experimental
      object implicits extends SQLImplicits with Serializable {
        protected override def _sqlContext: SQLContext = SparkSession.this.sqlContext
      }

здесь "искра" в "spark.implicits._" - это просто объект sparkSession, который мы создали.

Здесь - это еще одна ссылка!

Ответ 2

Вы можете сделать что-то похожее на то, что сделано в наборах для тестирования Spark. Например, это сработало бы (вдохновлено SQLTestData):

class SomeSpec extends FlatSpec with BeforeAndAfter { self =>

  var spark: SparkSession = _

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

  before {
    spark = SparkSession.builder().master("local").getOrCreate()
  }

  "a test" should "run" in {
    // implicits are working
    val df = spark.sparkContext.parallelize(List(1,2,3)).toDF()
  }
}

В качестве альтернативы вы можете напрямую использовать что-то вроде SharedSQLContext, которое предоставляет testImplicits: SQLImplicits, i.e.:

class SomeSpec extends FlatSpec with SharedSQLContext {
  import testImplicits._

  // ...

}

Ответ 3

Я просто создаю экземпляр SparkSession и прежде чем использовать "import implicits".

    @transient lazy val spark = SparkSession
    .builder()
    .master("spark://master:7777")
    .getOrCreate()

    import spark.implicits._