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

4
我是一名有帮助的助手,可以为您翻译文本。以下是需要翻译的内容:

我正在使用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.

我尝试添加一个case类,并将所有行映射到它上面,但仍然收到相同的错误提示。

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)的模式(schema)如下:
root
|-- item0: long (nullable = true)
|-- item1: string (nullable = true)
|-- item2: string (nullable = true)
1个回答

6
您正在尝试使用函数(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)]

另请参阅在尝试将数据框行映射到更新行时的编码器错误


感谢您的完整回答,@zero323。我目前正在学习Spark,尽管问题很愚蠢,但您对“编码器”的介绍非常有帮助。不过,我有一个快速的问题,就是如果没有为List等基本数据类型提供编码器,我该如何执行计算并获取它们呢? - JackOrJones
首先请查看https://spark.apache.org/docs/latest/sql-programming-guide.html#data-types。如果表中有内容,则无需担心。只要字段与SQL类型对应,Case类也将被处理。其他内容请参考:https://dev59.com/FloV5IYBdhLWcg3wIb74。 - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接