是否有一种有效的方法来更新CoordinateMatrix的某个索引(i,j)的值? 目前我正在使用map来迭代所有值并仅在我找到那些特定索引时进行更新,但我不认为这是正确的方法
答案 0 :(得分:0)
没有。 .as-console-wrapper { max-height: 100%!important; top: 0; }
由CoordinateMatrix
支持,并且是不可变的。即使您通过以下方式优化访问:
获取RDD
:
entries
转换为val mat: CoordinateMatrix = ???
val entries = mat.entries
RDD
并进行散列分区。
((row, col), value)
仅映射单个分区:
val n: Int = ???
val partitioner = new org.apache.spark.HashPartitioner(n)
val pairs = entries.map(e => ((e.i, e.j), e.value)).partitionBy(partitioner)
您还会为每次更新制作新的def update(mat: RDD[((Long, Long), Double)], i: Long, j: Long, v: Double) = {
val p = mat.partitioner.map(_.getPartition((i, j)))
p.map(p => mat.mapPartitionsWithIndex{
case (pi, iter) if pi == p => iter.map {
case ((ii, jj), _) if ii == i && jj == j => ((ii, jj), v)
case x => x
}
case (_, iter) => iter
})
}
。