将行映射到Array [String]时为什么没有编码器?

时间:2016-05-02 18:58:52

标签: scala apache-spark

Spark给我一个编译时错误

Error:(49, 13) Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._  Support for serializing other types will be added in future releases.
    .map(line => line.split(delimiter))
        ^

以下代码

val digital2 = sqlContext.read.text("path").as[String]
    .map(line => line.split(delimiter))
    .map(lineSplit => {
      new MyType(lineSplit(0), lineSplit(1), lineSplit(2), lineSplit(3)
        , lineSplit(4).toInt, lineSplit(5).toInt, lineSplit(6).toInt, lineSplit(7).toInt
      )
    })

但是这段代码很好用

val digital = sqlContext.read.text("path").as[String]
    .map(line => {
      val lineSplit = line.split(delimiter)
      new MyType(lineSplit(0), lineSplit(1), lineSplit(2), lineSplit(3)
        , lineSplit(4).toInt, lineSplit(5).toInt, lineSplit(6).toInt, lineSplit(7).toInt
      )
    }

我不跟踪发生的事情。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

在第一个示例中,.map(line => line.split(delimiter))将返回Dataset[Array[String]]。然后它需要Dataset[Array[String]]的编码器。但是,在1.6.1中增加了这种编码器。因此,如果您使用旧的Spark版本,则无法编译。