提问者:小点点

无法找到存储在数据集中的类型的编码器。错误,尽管提供了正确的含义[重复]


我正在测试一些基本的火花代码,其中我通过从数据源读取将数据帧转换为数据集。

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)找不到Characters类型的编码器。需要一个隐式编码器[Characters]来存储数据集中的Characters实例。通过导入lark. int,支持原始类型(Int,String等)和产品类型(case类)。_支持序列化其他类型将在以后的版本中添加。val peopleDS=spark.read.csv(path).as[Characters]

不过,我使用的是Spark 2.4和sbr 2.12.8。


共1个答案

匿名用户

实际上这里的问题是案例类在主对象中。出于某种原因,火花不喜欢it.It是一个愚蠢的错误,但花了一段时间才弄清楚缺少了什么。一旦我将案例类移出对象,它就编译得很好。

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]
  }
}