1

我是Spark 2.0的新用戶,並且在我們的代碼庫中使用數據集。我有點注意到我們需要在我們的代碼中無處不在。例如:用於導入各處火花隱含的解決方法

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

我想問問是什麼,如果有一個更清潔的方式來能夠做到

ds.map(e => "SomeString") 

不導入implicits在每一個功能,我做的地圖嗎?如果我不進口的話,我得到以下錯誤:

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

東西會有點幫助會做classobject,而不是每個函數內進口。爲了您的「文件」和「文件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對象。因此,這是可以做到的最好的。

希望它有幫助!