Импорт 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._
}
}
Не только это выглядит плохо, я не хочу делать это для каждого теста
Каков "правильный" способ сделать это?
Ответы
Ответ 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._