找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]

Posted

技术标签:

【中文标题】找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]【英文标题】: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。

【问题讨论】:

【参考方案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 之后我也遇到了这个问题。_ 将案例类定义移到顶部有助于解决问题。

以上是关于找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

找不到 AccessLog 类型的编码器。需要隐式 Encoder[AccessLog] 将 AccessLog 实例存储在数据集中

如何在数据集中存储自定义对象?

为啥使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?

“无法找到存储在数据集中的类型的编码器”,即使 spark.implicits._ 被导入?

Spark 错误:无法找到存储在数据集中的类型的编码器

在 SqlServer 提供程序清单中找不到存储类型“Varchar(100)”