首页 > 解决方案 > Scala Spark DataFrame Map Encoder 非原始类型

问题描述

我有一个 Scala Spark DataFrame(变量df):

id, values
"a", [0.5, 0.6]
"b", [0.1, 0.2]
...

我正在尝试利用RowMatrix有效地计算成对余弦相似度。

final case class dataRow(id: String, values: Array[Double])

val rows = df.as[dataRow].map {
  row => {
        Vectors.dense(row.values)
    }
}.rdd

我有以下编译错误

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._ 

最终,我可以做到这一点(RowMatrix 需要一个 RDD[Vector])

val mat = new RowMatrix(rows)

我已经导入了 spark.implicits_,我做错了什么?

标签: scalaapache-sparkdataframerdd

解决方案


类型根本没有隐式编码器Vector。所以要么在`rdd之后推送地图

val rows = df.as[dataRow].rdd.map(row => Vectors.dense(row.values))

或提供一个Encoder

import org.apache.spark.sql.Encoder
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder

ds.as[dataRow].map(x => Vectors.dense(x.values))(ExpressionEncoder(): Encoder[Vector])

推荐阅读