找不到用于存储在数据集中的类型的编码器。尽管提供了适当的隐式错误

时间:2019-02-08 21:54:41

标签: apache-spark apache-spark-dataset

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

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)找不到字符类型的编码器。隐式   需要Encoder [Characters]将Characters实例存储在   数据集。基本类型(整数,字符串等)和产品类型(大小写)   类)通过导入spark.implicits._来支持   序列化其他类型将在以后的版本中添加。       val peopleDS = spark.read.csv(path).as [字符]

虽然我使用的是Spark 2.4和sbr 2.12.8。

1 个答案:

答案 0 :(得分:1)

实际上,这里的问题是case class在主object内部。由于某种原因,spark不喜欢它。这是一个愚蠢的错误,但花了一段时间才弄清楚丢失了什么。一旦将case classobject中移出,它就可以正常编译了。

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