J'essaie d'importer spark.implicits._ Apparemment, il s'agit d'un objet dans une classe de scala. quand je l'importe dans une méthode comme celle-ci:
def f() = {
val spark = SparkSession()....
import spark.implicits._
}
Cela fonctionne bien, mais j’écris une classe de test et je veux rendre cette importation disponible pour tous les tests que j’ai essayés:
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._
}
}
Non seulement cela a l'air mauvais, je ne veux pas le faire à chaque test Quelle est la "bonne" façon de le faire?
Vous pouvez faire quelque chose de similaire à ce qui est fait dans les suites de tests Spark. Par exemple, cela fonctionnerait (inspiré par 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()
}
}
Sinon, vous pouvez utiliser quelque chose comme SharedSQLContext
directement, ce qui fournit un testImplicits: SQLImplicits
, c'est à dire.:
class SomeSpec extends FlatSpec with SharedSQLContext {
import testImplicits._
// ...
}
Je pense que le code GitHub dans le fichier SparkSession.scala peut vous donner un bon indice:
/**
* :: 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
}
ici, "spark" dans "spark.implicits._" n'est que l'objet sparkSession que nous avons créé.
Ici est une autre référence!
Je viens d'instancier SparkSession et avant d'utiliser, "import implique".
@transient lazy val spark = SparkSession
.builder()
.master("spark://master:7777")
.getOrCreate()
import spark.implicits._
Créez un objet sparksession et utilisez le fichier spark.implicit._ juste avant de convertir un fichier rdd en ensembles de données.
Comme ça:
val spark = SparkSession
.builder
.appName("SparkSQL")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val someDataset = someRdd.toDS