我有一个LabeledPoints的RDD。一个LabeledPoint表示一行稀疏数据(即大多数值为零的数据)。
结构如下:
val lp1 = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
第一个数组是列索引数组(想象一个数据帧列)。上面的LabeledPoint在第0列和第2列中具有值。
第二个数组是值。因此,列0的值为1.0,列2的值为3.0。 (第2列的值为0,因此从两个数组中省略)
问题: 我想删除第0列。这意味着第1列变为第0列,第2列变为第1列,依此类推。
我的代码如下:
private def internalShiftDownColumnsAfterIndex(index:Int):Unit=
{
labeledPointRDD.collect().map
{
lp =>
lp.features.toSparse.indices.sorted.zipWithIndex.foreach
{
case(colIndex,count) => if(colIndex > index)
{
lp.features.toSparse.indices.update(count, colIndex-1)
}
}
}
}
它不起作用。列索引数组不会更改。
val lpnew:RDD[LabeledPoint]=labeledPointRDD.collect().map{.......etc
也不起作用。这给出了编译错误
错误:类型不匹配;
[INFO]发现:需要数组[单位]:org.apache.spark.rdd.RDD [org.apache.spark.mllib.regression.LabeledPoint]
那么,更新索引数组的最佳方法是什么?