Spark 错误:无法找到存储在数据集中的类型的编码器
Posted
技术标签:
【中文标题】Spark 错误:无法找到存储在数据集中的类型的编码器【英文标题】:Spark Error: Unable to find encoder for type stored in a Dataset 【发布时间】:2016-09-15 18:27:04 【问题描述】:我在 Zeppelin 笔记本上使用 Spark,而 groupByKey() 似乎不起作用。
这段代码:
df.groupByKey(row => row.getLong(0))
.mapGroups((key, iterable) => println(key))
给我这个错误(可能是编译错误,因为它在我正在处理的数据集很大时立即显示):
error: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.
我尝试添加一个案例类并将我的所有行映射到其中,但仍然遇到相同的错误
import spark.implicits._
case class DFRow(profileId: Long, jobId: String, state: String)
def getDFRow(row: Row):DFRow =
return DFRow(row.getLong(row.fieldIndex("item0")),
row.getString(row.fieldIndex("item1")),
row.getString(row.fieldIndex("item2")))
df.map(DFRow(_))
.groupByKey(row => row.getLong(0))
.mapGroups((key, iterable) => println(key))
我的 Dataframe 的架构是:
root
|-- item0: long (nullable = true)
|-- item1: string (nullable = true)
|-- item2: string (nullable = true)
【问题讨论】:
【参考方案1】:您正在尝试使用函数 (Long, Iterator[Row]) => Unit
来 mapGroups
,而 Unit
没有 Encoder
(并不是说拥有一个函数是有意义的)。
一般来说,Dataset
API 中不关注 SQL DSL 的部分(DataFrame => DataFrame
、DataFrame => RelationalGroupedDataset
、RelationalGroupedDataset => DataFrame
、RelationalGroupedDataset => RelationalGroupedDataset
)需要对输出值进行隐式或显式编码器。
由于Row
对象没有预定义的编码器,因此将Dataset[Row]
与静态类型数据的方法设计一起使用没有多大意义。根据经验,您应该始终首先转换为静态类型的变体:
df.as[(Long, String, String)]
另见Encoder error while trying to map dataframe row to updated row
【讨论】:
感谢您的完整回答,@zero323。我目前正在学习 Spark,您对Encoder
s 的介绍很有帮助,尽管这个问题很愚蠢。不过,一个简单的问题是,如果没有编码器,我如何执行计算并获得像 List
这样的基本数据类型?
初学者请查看spark.apache.org/docs/latest/…。如果桌子上有东西,你就解决了。只要字段对应于 SQL 类型,就可以立即处理案例类。其余:***.com/q/36648128/1560062以上是关于Spark 错误:无法找到存储在数据集中的类型的编码器的主要内容,如果未能解决你的问题,请参考以下文章
找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]
为啥使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?
“找不到存储在数据集中的类型的编码器”和“方法映射的参数不足”?