Spark Error: Unable to find encoder for type stored in a Dataset
Spark Error: Unable to find encoder for type stored in a Dataset
我在 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.
我尝试添加一个案例 class 并将我的所有行映射到其中,但仍然出现相同的错误
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)
您正在尝试 mapGroups
使用函数 (Long, Iterator[Row]) => Unit
,但没有 Encoder
用于 Unit
(并不是说有一个就有意义)。
在 Dataset
API 的一般部分中,不关注 SQL DSL(DataFrame => DataFrame
、DataFrame => RelationalGroupedDataset
、RelationalGroupedDataset => DataFrame
, RelationalGroupedDataset => RelationalGroupedDataset
) 需要对输出值使用隐式或显式编码器。
由于 Row
对象没有预定义的编码器,因此使用 Dataset[Row]
和静态类型数据的方法设计没有多大意义。根据经验,您应该始终首先转换为静态类型的变体:
df.as[(Long, String, String)]
另见
我在 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.
我尝试添加一个案例 class 并将我的所有行映射到其中,但仍然出现相同的错误
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)
您正在尝试 mapGroups
使用函数 (Long, Iterator[Row]) => Unit
,但没有 Encoder
用于 Unit
(并不是说有一个就有意义)。
在 Dataset
API 的一般部分中,不关注 SQL DSL(DataFrame => DataFrame
、DataFrame => RelationalGroupedDataset
、RelationalGroupedDataset => DataFrame
, RelationalGroupedDataset => RelationalGroupedDataset
) 需要对输出值使用隐式或显式编码器。
由于 Row
对象没有预定义的编码器,因此使用 Dataset[Row]
和静态类型数据的方法设计没有多大意义。根据经验,您应该始终首先转换为静态类型的变体:
df.as[(Long, String, String)]
另见