到处导入 Spark 隐式的解决方法

2023-12-28

我是 Spark 2.0 的新手,并且在我们的代码库中使用数据集。我有点注意到我需要import spark.implicits._在我们的代码中随处可见。例如:

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

无需在我执行映射的每个函数中导​​入隐式函数?如果我不导入它,我会收到以下错误:

错误:(53, 13) 无法找到数据集中存储类型的编码器。通过导入spark.implicits来支持基本类型(Int、String等)和产品类型(case类)。_在未来的版本中将添加对序列化其他类型的支持。


有点帮助的事情是在class or object而不是每个函数。对于“文件 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.

不幸的是,据我所知,没有其他方法可以进一步减少进口数量。这是由于需要SparkSession实际执行时的对象import。因此,这是可以做的最好的事情。


Update:

更方便的方法是创建一个 ScalaTrait并将其与空的组合Object。这允许在每个文件的顶部轻松导入隐式,同时允许扩展特征以使用SparkSession目的。

Example:

trait SparkJob {
  val spark: SparkSession = SparkSession.builder.
    .master(...)
    .config(..., ....) // Any settings to be applied
    .getOrCreate()
}

object SparkJob extends SparkJob {}

这样我们就可以对文件 A 和 B 执行以下操作:

File A:

import SparkJob.spark.implicits._
class A extends SparkJob {
  spark.sql(...) // Allows for usage of the SparkSession inside the class
  ...
}

File B:

import SparkJob.spark.implicits._
class B extends SparkJob {
  ...    
}

请注意,只需扩展SparkJob对于使用的类或对象spark对象本身。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

到处导入 Spark 隐式的解决方法 的相关文章

随机推荐