坐标矩阵CoordinateMatrix
是一个基于矩阵项构成的RDD的分布式矩阵。每一个矩阵项MatrixEntry
都是一个三元组:(i: Long, j: Long, value: Double)
,其中i是行索引,j是列索引,value是该位置的值。
- 坐标矩阵一般在矩阵的两个维度都很大,且矩阵非常稀疏的时候使用。
CoordinateMatrix
实例可通过RDD[MatrixEntry]
实例来创建,其中每一个矩阵项都是一个(rowIndex, colIndex, elem)
的三元组
import org.apache.spark.mllib.linalg
import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry, RowMatrix}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
object Test {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().master("local").getOrCreate()
//创建两个矩阵项ent1和ent2,每一个矩阵项都是由索引和值构成的三元组
val ent1 = new MatrixEntry(0, 1, 0.5)
val ent2 = new MatrixEntry(2, 2, 1.8)
val entries: RDD[MatrixEntry] = spark.sparkContext.parallelize(Array(ent1, ent2))
//通过RDD[MatrixEntry]创建一个坐标矩阵
val matrix = new CoordinateMatrix(entries)
//从matrix提取rdd
val entries1: RDD[MatrixEntry] = matrix.entries
//MatrixEntry(0,1,0.5)
//MatrixEntry(2,2,1.8)
entries1.foreach(println)
//坐标矩阵可以进行转置
val matrix1: CoordinateMatrix = matrix.transpose()
//MatrixEntry(1,0,0.5)
//MatrixEntry(2,2,1.8)
matrix1.entries.foreach(println)
//坐标矩阵可以转为行矩阵
val rowmatrix: RowMatrix = matrix.toRowMatrix()
val rows: RDD[linalg.Vector] = rowmatrix.rows
//[0.0,0.5,0.0]
//[0.0,0.0,1.8]
rows.foreach((x: linalg.Vector) => {
println(x.toDense)
})
//计算相似度矩阵
val simMatrix: CoordinateMatrix = rowmatrix.columnSimilarities()
simMatrix.toRowMatrix().rows.foreach((x: linalg.Vector) =>{
println(x.toDense)
})
}
}