1

私はSpark 2.0を初めて使用し、コードベースでデータセットを使用しています。私はちょっと気付いて、import spark.implicits._私たちのコードのどこにでも必要です。例えば:私はマップを行うすべての関数で暗黙にインポートせずにどこでもspark implicitsをインポートするための回避策

ds.map(e => "SomeString") 

を行うことができるようにするクリーンな方法があります場合、私はお聞きしたかった何

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") 
    } 
} 

はありますか?私はそれをインポートしない場合、私は次のエラーを取得する:ビットではなく、各機能のclassまたはobject内のインポートを行うことであろう役立つだろう

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

私の答えはいくつかの追加情報で更新されました。あなたにフォローアップの質問があるかどうか尋ねることをためらってください。 – Shaido

答えて

0

何か。あなたの「ファイルA」と「ファイルB」の例について:このように

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") 
    } 
} 

、あなたはimportsの扱い量を取得します。

残念ながら、私の知る限り、輸入数をさらに減らす方法はありません。これは実際にimportを実行するときにSparkSessionオブジェクトが必要なためです。したがって、これは実行可能な最高です。

希望すると助かります!

関連する問題