一个分布式矩阵有一个 long 型的行、列索引,double 类型的值,以一个或者多个 RDD 的形式分布式存储。
<br/>
存储巨大和分布式的矩阵需要选择一个正确的存储格式。将一个分布式矩阵转换为一个不同的格式可能需要一个全局的shuffle,代价是非常高的。目前为止,总共有四种类型的分布式矩阵已经被实现了。
(1)RowMatrix 矩阵:是一个面向行的矩阵,行索引是没有意义的,比如,一个特征向量。RDD 的每个行都是一个本地行向量。这里面 RowMatrix假设的是列数不多,所以一个本地向量可以本传到 driver 端,可以轻松的被一个节点处理和存储。
(2) IndexedRowMatrix:跟 RowMatrix 很相似,但是它有一个行索引,该索引可以用于识别行并且执行 joins。
(3)CoordinateMatrix:是一个以 coordinate list (COO)格式存储的分布式矩阵。`(row, column, value)`。
(4) BlockMatrix:是一个分布式矩阵,格式是`((Int, Int), Matrix)`。
<br/>
注意:分布式矩阵的底层 RDD 必须是确定性的,因为我们要缓存矩阵大小。一般来说,使用非确定性的 RDD 可能会导致错误。
<br/>
```scala
import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object DistributedMatrix {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]")
.setAppName(this.getClass.getName)
val sc: SparkContext = SparkContext.getOrCreate(conf)
val rows: RDD[Vector] = sc.makeRDD(Seq(Vectors.dense(1, 2, 3), Vectors.dense(4, 5, 6)))
rows.foreach(println)
// [1.0,2.0,3.0]
// [4.0,5.0,6.0]
val mat: RowMatrix = new RowMatrix(rows)
println(mat.numRows()) // 2
println(mat.numCols()) // 3
}
}
```