前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何将RDD或者MLLib矩阵zhuanzhi

如何将RDD或者MLLib矩阵zhuanzhi

作者头像
Spark学习技巧
发布2018-01-31 12:25:20
1.3K0
发布2018-01-31 12:25:20
举报
文章被收录于专栏:Spark学习技巧

最近老有人在qq群或者公众号留言问浪尖如何将Spark Mllib的矩阵或者将一个RDD进行转置操作。Spark Mllib的矩阵有多种形式,分布式和非分布式,非分布式在这里浪尖就不讲了,很简单,因为他是基于数组的。而分布式存储是基于RDD的,那么问题就又变成了如何将一个RDD进行转置。

首先我们来介绍一下什么是转置操作:

百科上的定义,将一个矩阵的行列互换得到的矩阵就是该矩阵的转置。

要想把一个RDD的行列互换的话,主要思路如下:

1,先转化RDD,给每一行带上唯一的行号(row, rowIndex)。

2,针对RDD的每一行,转化为(value, colIndex),并整理的到(colIndex.toLong, (rowIndex, value))

3,进行flatmap

4,步骤3完成后,我们只需要按照3key进行分组,并按照其key进行排序就可以得到转化后列式有序。

5,完成步骤4后,我们就可以按照每一行的(rowIndex, value),使用下标和其值构建新的行,保证每一行转换后的顺序。

到此转换完成。

具体步骤如下:

代码语言:js
复制

def transposeRowMatrix(m: RowMatrix): RowMatrix = {
  val transposedRowsRDD = m.rows.zipWithIndex.map{case (row, rowIndex) => rowToTransposedTriplet(row, rowIndex)}
    .flatMap(x => x) //  (newRowIndex, (newColIndex, value))
    .groupByKey
    .sortByKey().map(_._2) // 对row进行排序,去除掉索引
    .map(buildRow) // 利用索引和值,重新构建每一行,去掉索引
  new RowMatrix(transposedRowsRDD)
}
//转换每一行
    def rowToTransposedTriplet(row: Vector, rowIndex: Long): Array[(Long, (Long, Double))] = {
      val indexedRow = row.toArray.zipWithIndex
      indexedRow.map{case (value, colIndex) => (colIndex.toLong, (rowIndex, value))}
    }
//构建新的行
    def buildRow(rowWithIndexes: Iterable[(Long, Double)]): Vector = {
      val resArr = new Array[Double](rowWithIndexes.size)
      rowWithIndexes.foreach{case (index, value) =>
        resArr(index.toInt) = value
      }
      Vectors.dense(resArr)
    }

测试

准备数据

代码语言:js
复制
val observations = sc.parallelize(
  Seq(
    Vectors.dense(1.0, 10.0, 100.0,2.0),
    Vectors.dense(2.0, 20.0, 200.0,2.0),
    Vectors.dense(3.0, 30.0, 300.0,2.0)
  )
)

生成矩阵

代码语言:javascript
复制
val mat: RowMatrix = new RowMatrix(observations)

会发现行列已经互换。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浪尖聊大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档