【问题标题】:Unable to find encoder for type stored in a Dataset. error in spite of providing the proper implicits [duplicate]找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]
【发布时间】:2019-02-08 21:54:40
【问题描述】:

我正在测试一些基本的 spark 代码,其中我通过从数据源读取将数据帧转换为数据集。

import org.apache.spark.sql.SparkSession


object RunnerTest {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("SparkSessionExample")
      .master("local[4]")
      .config("spark.sql.warehouse.dir", "target/spark-warehouse")
      .getOrCreate
case class Characters(name: String, id: Int)
    import spark.implicits._
    val path = "examples/src/main/resources/Characters.csv"
    val peopleDS = spark.read.csv(path).as[Characters]
  }
}

这是太简单的代码,但我收到编译错误提示,

错误:(42, 43) 找不到字符类型的编码器。隐含的 需要 Encoder[Characters] 将 Characters 实例存储在 数据集。原始类型(Int、String 等)和产品类型(案例 类)通过导入 spark.implicits._ 支持 序列化其他类型将在以后的版本中添加。 val peopleDS = spark.read.csv(path).as[Characters]

我正在使用 Spark 2.4 和 sbr 2.12.8。

【问题讨论】:

    标签: apache-spark apache-spark-dataset


    【解决方案1】:

    实际上这里的问题是case class 在主object 内。出于某种原因,spark 不喜欢它。这是一个愚蠢的错误,但花了一段时间才弄清楚缺少什么。一旦我将case class 移出object,它就编译得很好。

    import org.apache.spark.sql.SparkSession
    
    case class Characters(name: String, id: Int)
    
    object RunnerTest {
      def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder.appName("SparkSessionExample")
          .master("local[4]")
          .config("spark.sql.warehouse.dir", "target/spark-warehouse")
          .getOrCreate
        import spark.implicits._
        val path = "examples/src/main/resources/Characters.csv"
        val peopleDS = spark.read.csv(path).as[Characters]
      }
    }
    

    【讨论】:

    • 即使在 import spark.implicits 之后我也遇到了这个问题。_ 将案例类定义移到顶部有助于解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多