一個分布式矩陣有一個 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
}
}
```