【发布时间】:2017-09-04 13:48:06
【问题描述】:
让Q成为Spark中的分布式行矩阵,我想计算Q与其转置Q'。
然而,虽然行矩阵确实有一个 multiply() 方法,但它只能接受本地矩阵作为参数。
代码说明(Scala):
val phi = new RowMatrix(phiRDD) // phiRDD is an instance of RDD[Vector]
val phiTranspose = transposeRowMatrix(phi) // transposeRowMatrix()
// returns the transpose of a RowMatrix
val crossMat = ? // phi * phiTranspose
请注意,我想执行 2 Distributed RowMatrix 的点积,而不是分布式行矩阵与本地行矩阵。
一种解决方案是使用IndexedRowMatrix,如下所示:
val phi = new IndexedRowMatrix(phiRDD) // phiRDD is an instance of RDD[IndexedRow]
val phiTranspose = transposeMatrix(phi) // transposeMatrix()
// returns the transpose of a Matrix
val crossMat = phi.toBlockMatrix().multiply( phiTranspose.toBlockMatrix()
).toIndexedRowMatrix()
但是,我想使用行矩阵方法,例如 tallSkinnyQR(),这意味着我应该使用.toRowMatrix() 方法将crossMat 转换为行矩阵:
val crossRowMat = crossMat.toRowMatrix()
终于可以申请了
crossRowMat.tallSkinnyQR()
但是这个过程包括分布式矩阵类型之间的许多转换,根据我从MLlib Programming Guide 了解到的,这是昂贵的:
选择正确的格式来存储大型分布式矩阵非常重要。将分布式矩阵转换为不同的格式可能需要全局 shuffle,这非常昂贵。
请有人详细说明一下。
【问题讨论】:
标签: apache-spark linear-algebra distributed-computing apache-spark-mllib matrix-multiplication