💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
一个分布式矩阵有一个 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 } } ```