web-dev-qa-db-fra.com

Import de spark.implicits._ dans scala

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?

41
ShinySpiderdude

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._

  // ...

}
19
bluenote10

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!

10
Kehe CAI

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._
5
seufagner

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
0
KayV