为什么创建自定义案例类的数据集时“为什么找不到用于存储在数据集中的类型的编码器?

问题描述 投票:53回答:3

Spark 2.0(最终版)与Scala 2.11.8。以下超级简单代码产生编译错误Error:(17, 45) 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 org.apache.spark.sql.SparkSession

case class SimpleTuple(id: Int, desc: String)

object DatasetTest {
  val dataList = List(
    SimpleTuple(5, "abc"),
    SimpleTuple(6, "bcd")
  )

  def main(args: Array[String]): Unit = {
    val sparkSession = SparkSession.builder.
      master("local")
      .appName("example")
      .getOrCreate()

    val dataset = sparkSession.createDataset(dataList)
  }
}
scala apache-spark apache-spark-dataset apache-spark-encoders
3个回答
79
投票

Spark Datasets要求Encoders表示要存储的数据类型。对于常见的类型(原子,产品类型),有许多可用的预定义编码器,但是您必须首先从SparkSession.implicits导入这些编码器才能使其起作用:

SparkSession.implicits

或者,您可以直接提供一个明确的

val sparkSession: SparkSession = ???
import sparkSession.implicits._
val dataset = sparkSession.createDataset(dataList)

或隐式

import org.apache.spark.sql.{Encoder, Encoders}

val dataset = sparkSession.createDataset(dataList)(Encoders.product[SimpleTuple])

implicit val enc: Encoder[SimpleTuple] = Encoders.product[SimpleTuple] val dataset = sparkSession.createDataset(dataList) 用于存储的类型。

请注意,Encoder还为原子类型提供了许多预定义的Encoders,而对于复杂原子类型则提供了Encoders,可以使用Encoders派生。

进一步阅读:


49
投票

对于其他用户(您是正确的),请注意,在Encoder error while trying to map dataframe row to updated row范围之外定义https://stackoverflow.com/a/34715827/3535853也很重要。因此:


-1
投票

我想回答我自己的问题,如果目标是定义一个简单的文字SparkData框架,而不是使用Scala元组和隐式转换,则更简单的方法是像这样直接使用Spark API:] >

case class SimpleTuple(id: Int, desc: String)

object DatasetTest {   
  val dataList = List(
    SimpleTuple(5, "abc"),
    SimpleTuple(6, "bcd")
  )

  def main(args: Array[String]): Unit = {
    val sparkSession = SparkSession.builder
      .master("local")
      .appName("example")
      .getOrCreate()

    import sparkSession.implicits._
    val dataset = sparkSession.createDataset(dataList)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.