在Spark中,如何将带有SparseVector的DataFrame转换为RDD [Vector]?

时间:2017-10-11 21:57:30

标签: apache-spark apache-spark-mllib

关注this example我已为某些文档计算了TF-IDF权重。现在我想使用RowMatrix来计算文档的相似性。但我无法将数据拟合成正确的格式。我现在拥有的是一个DataFrame,其行(String,SparseVector)作为两列'类型。我应该将其转换为RDD[Vector],我认为这很简单:

features.map(row => row.getAs[SparseVector](1)).rdd()

但是我收到了这个错误:

<console>:58: error: 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.

导入spark.implicits._没有任何区别。

那是怎么回事?我很惊讶Spark并不知道如何编码自己的矢量数据类型。

1 个答案:

答案 0 :(得分:1)

只需在RDD之前转换为map

import org.apache.spark.ml.linalg._

val df = Seq((1, Vectors.sparse(1, Array(), Array()))).toDF

df.rdd.map(row => row.getAs[Vector](1))