software - Importación de spark.implicits._ en scala
spark scala tutorial (3)
Estoy intentando importar spark.implicits._ Aparentemente, este es un objeto dentro de una clase en scala. cuando lo importo en un método como ese:
def f() = {
val spark = SparkSession()....
import spark.implicits._
}
Funciona bien, sin embargo, estoy escribiendo una clase de prueba y quiero que esta importación esté disponible para todas las pruebas que he probado:
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._
}
}
No solo se ve mal, no quiero hacerlo en cada prueba. ¿Cuál es la forma "correcta" de hacerlo?
Creo que el código de GitHub en el archivo SparkSession.scala puede darte una buena pista:
/**
* :: 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
}
aquí "spark" en "spark.implicits._" es solo el objeto sparkSession que creamos.
Here hay otra referencia!
Puede hacer algo similar a lo que se hace en las suites de pruebas Spark. Por ejemplo, esto funcionaría (inspirado en 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()
}
}
Alternativamente, puede usar algo como SharedSQLContext
directamente, que proporciona un testImplicits: SQLImplicits
, es decir:
class SomeSpec extends FlatSpec with SharedSQLContext {
import testImplicits._
// ...
}
Simplemente instalé SparkSession y antes de usar, "import implicits".
@transient lazy val spark = SparkSession
.builder()
.master("spark://master:7777")
.getOrCreate()
import spark.implicits._