Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

  不多说,直接上干货!

Distributed  matrix : 分布式矩阵

  一般能采用分布式矩阵,说明这数据存储下来,量还是有一定的。
在Spark Mllib里,提供了四种分布式矩阵存储形式,均由支持长整形的行列数和双精度浮点型的数据内容组成。
  包括行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵。 依据你数据的不同的特点,你可以选择不同类型的数据。   

  (1)、行矩阵: 以行为基本方向的矩阵存储格式,列的作用相对较少。
      理解记忆,行矩阵是一个巨大的特征向量的集合  
      每一行就是一个具有相同格式的向量数据,且每一行的向量内容都可以单独取出来进行操作。
    要注意的是,此种矩阵不能按照行号访问。(我也不知道为什么这样 Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)


testRowMatrix.scala
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)
package zhouls.bigdata.chapter4

import org.apache.spark._
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.linalg.distributed.RowMatrix object testRowMatrix {
def main(args: Array[String]) {
val conf = new SparkConf() //创建环境变量
.setMaster("local") //设置本地化处理
.setAppName("testRowMatrix") //设定名称
val sc = new SparkContext(conf) //创建环境变量实例
val rdd = sc.textFile("data/input/chapter4/RowMatrix.txt") //创建RDD文件路径
.map(_.split(' ') //按“ ”分割
.map(_.toDouble)) //转成Double类型
.map(line => Vectors.dense(line)) //转成Vector格式
val rm = new RowMatrix(rdd) //读入行矩阵
println(rm.numRows()) //打印列数
println(rm.numCols()) //打印行数
}
}
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)
  这里,我带你是的
RowMatrix要从RDD[Vector]构造,m是mat的行数,n是mat的列。


Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

 (2)  带有行索引的矩阵
    单纯的行矩阵对其内容无法进行直接显示,当然可以通过调用其方法显示内部数据内推。即通过带有行索引的行矩阵。
  IndexedRowMatrix矩阵和RowMatrix矩阵的不同之处在于,你可以通过索引值来访问每一行。其他的,没啥区别。
  
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)


testIndexedRowMatrix.scala
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)
package zhouls.bigdata.chapter4

import org.apache.spark._
import org.apache.spark.mllib.linalg.distributed.{IndexedRow, RowMatrix, IndexedRowMatrix}
import org.apache.spark.mllib.linalg.{Vector, Vectors} object testIndexedRowMatrix {
def main(args: Array[String]) {
val conf = new SparkConf() //创建环境变量
.setMaster("local") //设置本地化处理
.setAppName("testIndexedRowMatrix") //设定名称
val sc = new SparkContext(conf) //创建环境变量实例
val rdd = sc.textFile("data/input/chapter4/loadLibSVMFile.txt") //创建RDD文件路径
.map(_.split(' ') //按“ ”分割
.map(_.toDouble)) //转成Double类型
.map(line => Vectors.dense(line)) //转化成向量存储
.map((vd) => new IndexedRow(vd.size,vd)) //转化格式
val irm = new IndexedRowMatrix(rdd) //建立索引行矩阵实例
println(irm.getClass) //打印类型
println(irm.rows.foreach(println)) //打印内容数据
}
}
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)
  打印结果是
  
class  org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix
IndexedRow(3,[1.0,2.0,3.0])
IndexedRow(3,[4.0,5.0,6.0])
  注意:IndexedRowMatrix除了这个带有行索引的行矩阵功能外,还有其他功能,如:
      toRowMatrix将其转化成单纯的行矩阵,toCoordinateMatrix将其转化成坐标矩阵,toBlockMatrix将其转化成块矩阵。


(3) 坐标矩阵
    是一种带有坐标标记的矩阵。
  坐标矩阵一般用于数据比较多且数据较为分散的情形,即矩阵中含0或者某个具体值较多的情况下。
  当你的数据特别稀疏的时候怎么办?采用这种坐标矩阵吧。
  CoordinateMatrix矩阵中的存储形式是(row,col,value),就是原始的最稀疏的方式,所以如果矩阵比较稠密,别用这种数据格式。
  其中的每一个具体数据都有一组坐标进行标示。其类型格式如下:
(x: Long  ,  y:Long  , value:Double)

  x和y分别代表标示坐标的坐标轴标号,value是具体内容。x是行坐标,y是列坐标。



Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)


testCoordinateRowMatrix.scala
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)
package zhouls.bigdata.chapter4

import org.apache.spark._
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry} object testCoordinateRowMatrix {
def main(args: Array[String]) {
val conf = new SparkConf() //创建环境变量
.setMaster("local") //设置本地化处理
.setAppName("testCoordinateRowMatrix") //设定名称
val sc = new SparkContext(conf) //创建环境变量实例
val rdd = sc.textFile("data/input/chapter4/loadLibSVMFile.txt") //创建RDD文件路径
.map(_.split(' ') //按“ ”分割
.map(_.toDouble)) //转成Double类型
.map(vue => (vue(0).toLong,vue(1).toLong,vue(2))) //转化成坐标格式
.map(vue2 => new MatrixEntry(vue2 _1,vue2 _2,vue2 _3)) //转化成坐标矩阵格式
val crm = new CoordinateMatrix(rdd) //实例化坐标矩阵
println(crm.entries.foreach(println)) //打印数据
}
}
Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

   运行结果是,
MatrixEntry(1,2,3.0)
MatrixEntry(4,5,6.0)
 
上一篇:Django 基础介绍


下一篇:Struts2内建拦截器