找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]
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 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?