如何将RDD或者MLLib矩阵zhuanzhi


最近老有人在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),使用下标和其值构建新的行,保证每一行转换后的顺序。

到此转换完成。

具体步骤如下:


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)
}


测试

准备数据

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)
)
)

生成矩阵

val mat: RowMatrix = new RowMatrix(observations)

会发现行列已经互换。




推荐阅读:

1,HBase在滴滴出行的应用场景和最佳实践

2,SparkML模型选择(超参数调整)与调优

3,SparkMLLib中基于DataFrame的TF-IDF

4,用java提交一个Spark应用程序






关于Spark学习技巧

kafkahbasespark,Flink等入门到深入源码,spark机器学习,大数据安全,大数据运维,请关注浪尖公众号,看高质量文章。

更多文章,敬请期待




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值