spark 矩阵转置 java,矩阵在Spark中的RowMatrix上转置

Suppose I have a RowMatrix.

How can I transpose it. The API documentation does not seem to have a transpose method.

The Matrix has the transpose() method. But it is not distributed. If I have a large matrix greater that the memory how can I transpose it?

I have converted a RowMatrix to DenseMatrix as follows

DenseMatrix Mat = new DenseMatrix(m,n,MatArr);

which requires converting the RowMatrix to JavaRDD and converting JavaRDD to an array.

Is there any other convenient way to do the conversion?

Thanks in advance

解决方案

You are correct: there is no

RowMatrix.transpose()

method. You will need to do this operation manually.

Here is the non-distributed/local matrix versions:

def transpose(m: Array[Array[Double]]): Array[Array[Double]] = {

(for {

c

} yield m.map(_(c)) ).toArray

}

The distributed version would be along the following lines:

origMatRdd.rows.zipWithIndex.map{ case (rvect, i) =>

rvect.zipWithIndex.map{ case (ax, j) => ((j,(i,ax))

}.groupByKey

.sortBy{ case (i, ax) => i }

.foldByKey(new DenseVector(origMatRdd.numRows())) { case (dv, (ix,ax)) =>

dv(ix) = ax

}

Caveat: I have not tested the above: it will have bugs. But the basic approach is valid - and similar to work I had done in the past for a small LinAlg library for spark.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值