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对象。因此,这是可以做到的最好的。

希望它有帮助!