首页 > 解决方案 > 在没有 RDD 的数据帧列值提取中定义隐式/显式编码的最佳实践

问题描述

我正在尝试在没有 RDD 映射 api 的集合中获取列数据(使用纯数据框方式)

object CommonObject{
    def doSomething(...){
        .......
        val releaseDate = tableDF.where(tableDF("item") <=> "releaseDate").select("value").map(r => r.getString(0)).collect.toList.head
    }
}

这一切都很好,除了 Spark 2.3 建议

No implicits found for parameter evidence$6: Encoder[String]

map和之间collect

map(r => r.getString(0))(...).collect

我明白要添加

import spark.implicits._

在过程之前但是它需要一个spark session实例

这很烦人,尤其是当方法中没有火花会话实例时。作为一个 Spark 新手,如何很好地解决上下文中的隐式编码参数?

标签: scalaapache-sparkapache-spark-sql

解决方案


你总是可以SparkSession.builder.getOrCreate()在你的方法中添加一个调用。Spark 会找到已经存在的 SparkSession 而不会创建新的,因此不会影响性能。然后,您可以导入适用于所有案例类的显式。这是添加编码的最简单方法。或者,可以使用Encoders类添加显式编码器。

    val spark = SparkSession.builder
      .appName("name")
      .master("local[2]")
      .getOrCreate()
    import spark.implicits._

另一种方法是从数据框中获取 SparkSessiondataframe.sparkSession

    def dummy (df : DataFrame) = {
    val spark = df.sparkSession
    import spark.implicits._
    }

推荐阅读