Spark学习(九):分布式矩阵

十余天没有学习Spark了,不是我在偷懒,而是前段时间一直在研究形态学算法提取波形的问题。现在算法差不多搞定啦,但是用Python开发的,有空有能力时再补上Spark的程序。还是先来记录一下分布式矩阵的用法吧~

一般采用分布式矩阵进行存储都在数据量非常大的情况下进行,处理速度和效率与其存储格式息息相关。MLlib提供了四种分布式矩阵存储形式,分别为:行矩阵,带有行索引的行矩阵,坐标矩阵和块矩阵,据说分块矩阵并不常用。

行矩阵

行矩阵以行作为基本的矩阵存储格式,每一行的内容都可以单独取出来进行操作,列的作用相较小。

带索引的行矩阵

为了方便在系统调试的过程中对行矩阵的内容进行观察和显示,MLlib提供了带索引的行矩阵。

坐标矩阵

坐标矩阵是一种带有坐标标记的矩阵,其中的每一个具体数据都有一组坐标进行标示,类型格式如下:
(x: Long, y: Long, values: Double)

分块矩阵

顾名思义,就是将矩阵分块(好废话哦)。分块矩阵可由带索引的行矩阵IndexedRowMatrix或坐标矩阵CoordinateMatrix调用toBlockMatrix()方法来进行转换。

例程

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.mllib.linalg.{Matrix, Matrices, Vectors, Vector}
import org.apache.spark.mllib.linalg.distributed.{RowMatrix, IndexedRowMatrix, IndexedRow, CoordinateMatrix, MatrixEntry}

object RDDMatrix {
  def main(args: Array[String]): Unit = {
    println("--------------------------本地矩阵-------------------------------")
    val mx = Matrices.dense(2, 3, Array(1, 2, 3, 4, 5, 6)) // 创建2行3列的本地矩阵,Matrices.dense是矩阵重组的调用方法
    println(mx)

    println("--------------------------分布式行矩阵------------------------------")
    val conf = new SparkConf().setAppName("Distributed matrix").setMaster("local")
    val sc = new SparkContext(conf)
    val path = "F:/ScalaProject/test/collaborativeFilter/src/main/resources/Kmeans.txt"
    val rdd = sc.textFile(path).map(_.split(" ").map(_.toDouble)) // 转化成Double类型的向量存储
    val rdd1 = rdd.map(line => Vectors.dense(line))  // 转换成向量存储
    val rm = new RowMatrix(rdd1) // 读入行矩阵
    // 如果打印rm中的具体内容,结果显示是数据的内存地址。这表明RowMatrix只是一个转化操作,并不运行最终结果。
    println(rm.numRows())         // 打印行数
    println(rm.numCols())         // 打印列数

    println("--------------------------带索引的行矩阵---------------------------")
    val rdd2 = rdd1.map(vd => new IndexedRow(vd.size, vd)) // 转化格式
    val irm = new IndexedRowMatrix(rdd2)  // 建立索引行矩阵实例
    println(irm.getClass) // 打印类型
    irm.rows.foreach(println)// 打印内容数据

    println("---------------------------坐标矩阵--------------------------------")
    val rdd3 = rdd.map(vue => (vue(0).toLong, vue(1).toLong, vue(2))).  // 转化成坐标格式
      map(vue2 => new MatrixEntry(vue2._1, vue2._2, vue2._3))           // 转化成坐标矩阵格式
    // vue(0)和vue(1)分别是行和列坐标的坐标轴标号,vue(2)是具体内容
    // ._1 和 ._2 是scala语句中元组参数的序数专用标号,分别是传入第二个和第三个值
    val crm = new CoordinateMatrix(rdd3)  // 直接打印CoordinateMatrix实例的对象也仅仅是内存地址
    crm.entries.foreach(println)


    println("--------------------------分块矩阵---------------------------")
    // 将坐标矩阵转换成2x2的分块矩阵并存储,尺寸通过参数传入
    val matA = irm.toBlockMatrix(2,2).cache()
    // 查看其分块情况
    matA.blocks.collect.foreach(println)
    println(matA.numColBlocks)
    println(matA.numRowBlocks)
  }
}

原始数据:

1 2 2
1 1 1
1 3 3
2 2 2
3 4 5
4 3 3
2 2 2
4 4 1

运行结果:

--------------------------本地矩阵-------------------------------
1.0  3.0  5.0  
2.0  4.0  6.0  
--------------------------分布式行矩阵------------------------------
8
3
--------------------------带索引的行矩阵---------------------------
class org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix
IndexedRow(3,[1.0,2.0,2.0])
IndexedRow(3,[1.0,1.0,1.0])
IndexedRow(3,[1.0,3.0,3.0])
IndexedRow(3,[2.0,2.0,2.0])
IndexedRow(3,[3.0,4.0,5.0])
IndexedRow(3,[4.0,3.0,3.0])
IndexedRow(3,[2.0,2.0,2.0])
IndexedRow(3,[4.0,4.0,1.0])
---------------------------坐标矩阵--------------------------------
MatrixEntry(1,2,2.0)
MatrixEntry(1,1,1.0)
MatrixEntry(1,3,3.0)
MatrixEntry(2,2,2.0)
MatrixEntry(3,4,5.0)
MatrixEntry(4,3,3.0)
MatrixEntry(2,2,2.0)
MatrixEntry(4,4,1.0)
--------------------------分块矩阵---------------------------
((1,1),2 x 1 CSCMatrix
(1,0) 19.0)
((1,0),2 x 2 CSCMatrix
(1,0) 18.0
(1,1) 21.0)
2
2

至于分块矩阵为什么会输出这么奇怪的结果,还没有研究明白,等搞明白再补上吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342