为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

使用Scala 2.11.8的Spark 2.0(最终版)。以下超级简单代码产生编译错误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.SparkSessioncase 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)  }}
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

Spark Datasets需要Encoders即将存储的数据类型。对于常见类型(原子,产品类型),有许多可用的预定义编码器,但是您必须首先从中导入这些编码器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 用于存储的类型。


请注意,Enocders还提供了一些Encoders针对原子类型的预定义,Encoders对于复杂的原子类型,可以使用进行预定义ExpressionEncoder。


进一步阅读:


对于内置编码器未涵盖的自定义对象,请参见如何在数据集中存储自定义对象?

对于Row对象,您必须在尝试将数据框行映射到更新的行时Encoder明确提供如编码器错误所示的对象


查看完整回答
反对 回复 2019-11-30
?
偶然的你

TA贡献1841条经验 获得超3个赞

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


  import org.apache.spark.sql._

  import org.apache.spark.sql.types._

  import scala.collection.JavaConverters._


  val simpleSchema = StructType(

    StructField("a", StringType) ::

    StructField("b", IntegerType) ::

    StructField("c", IntegerType) ::

    StructField("d", IntegerType) ::

    StructField("e", IntegerType) :: Nil)


  val data = List(

    Row("001", 1, 0, 3, 4),

    Row("001", 3, 4, 1, 7),

    Row("001", null, 0, 6, 4),

    Row("003", 1, 4, 5, 7),

    Row("003", 5, 4, null, 2),

    Row("003", 4, null, 9, 2),

    Row("003", 2, 3, 0, 1)

  )


  val df = spark.createDataFrame(data.asJava, simpleSchema)


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 856 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信