1

Je suis nouveau sur Spark 2.0 et j'utilise des ensembles de données dans notre base de code. Je remarque un peu que j'ai besoin de import spark.implicits._ partout dans notre code. Par exemple:Solution de contournement pour importer des implicits d'étincelles partout

File A 
class A { 
    def job(spark: SparkSession) = { 
     import spark.implcits._ 
     //create dataset ds 
     val b = new B(spark) 
     b.doSomething(ds) 
     doSomething(ds) 
    } 
    private def doSomething(ds: Dataset[Foo], spark: SparkSession) = { 
     import spark.implicits._ 
     ds.map(e => 1)    
    } 
} 

File B 
class B(spark: SparkSession) { 
    def doSomething(ds: Dataset[Foo]) = { 
     import spark.implicits._ 
     ds.map(e => "SomeString") 
    } 
} 

Ce que je voulais demander est s'il y a un propre façon de pouvoir faire

ds.map(e => "SomeString") 

sans implicits importer dans toutes les fonctions où je fais la carte? Si je le fais, j'importer pas eu l'erreur suivante:

Error:(53, 13) Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.

+0

Mise à jour ma réponse avec quelques informations supplémentaires. N'hésitez pas à demander si vous avez des questions de suivi. – Shaido

Répondre

0

quelque chose qui aiderait un peu serait de faire l'importation dans la class ou object au lieu de chaque fonction. Pour des exemples « Un fichier » et « B » Fichier:

File A 
class A { 
    val spark = SparkSession.builder.getOrCreate() 
    import spark.implicits._ 

    def job() = { 
     //create dataset ds 
     val b = new B(spark) 
     b.doSomething(ds) 
     doSomething(ds) 
    } 

    private def doSomething(ds: Dataset[Foo]) = { 
     ds.map(e => 1)    
    } 
} 

File B 
class B(spark: SparkSession) { 
    import spark.implicits._ 

    def doSomething(ds: Dataset[Foo]) = {  
     ds.map(e => "SomeString") 
    } 
} 

De cette façon, vous obtenez une quantité raisonnable de imports.

Malheureusement, à ma connaissance, il n'y a pas d'autre moyen de réduire encore le nombre d'importations. Cela est dû à la nécessité de l'objet SparkSession lors de la réalisation de la import réelle. Par conséquent, c'est le meilleur qui peut être fait.

J'espère que ça aide!