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

Posted

技术标签:

【中文标题】为啥使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?【英文标题】:Why does mapping over a DataFrame using a case class fail with "Unable to find encoder for type stored in a Dataset"?为什么使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”? 【发布时间】:2017-12-25 18:41:47 【问题描述】:

我已经导入了spark.implicits._ 但还是报错

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

我有一个类似的案例类:

case class User(name: String, dept: String)

我正在使用以下方法将 Dataframe 转换为数据集:

val ds = df.map  row=> User(row.getString(0), row.getString(1) 

val ds = df.as[User]

另外,当我在 Spark-shell 中尝试相同的代码时,我没有收到任何错误,只有当我通过 IntelliJ 运行它或提交作业时,我才会收到此错误。

有什么原因吗?

【问题讨论】:

【参考方案1】:

将案例类的声明移出范围就可以了!

代码结构如下:

package main.scala.UserAnalytics

// case class *outside* the main object
case class User(name: string, dept: String)

object UserAnalytics extends App 
    ...
    ds = df.map  row => User(row.getString(0), row.getString(1)) 

【讨论】:

以上是关于为啥使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Flutter CustomPainter 类在使用 scanAngle 小于 2*pi 的 canvas..drawArc() 函数时不在屏幕上绘制任何内容?

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

在不使用 UDF 的情况下基于映射转换 Spark DataFrame 中的列

为啥有些 ioctl 案例总是失败?

在 DataFrame 上应用映射函数

为啥结构必须与模板类在同一个命名空间中才能编译?