问题描述
我想使用Apache Spark和java做矩阵乘法。
我有2个主要问题:
- 如何创建RDD可以在Apache的星火重新present矩阵?
- 如何将两个这样的RDD?
所有依赖于输入数据和尺寸,但一般来讲,你要的是不是一个 RDD
但一从<$c$c>org.apache.spark.mllib.linalg.distributed$c$c>.在这个时刻提供的<$c$c>DistributedMatrix$c$c>
-
<$c$c>IndexedRowMatrix$c$c> - 可以直接从
创建RDD [IndexedRow]
其中,<$c$c>IndexedRow$c$c>由行索引和org.apache.spark.mllib.linalg.Vector
进口org.apache.spark.mllib.linalg {向量,矩阵}
进口org.apache.spark.mllib.linalg.distributed {IndexedRowMatrix,
IndexedRow}VAL行= sc.parallelize(SEQ(
(0L,阵列(1.0,0.0,0.0)),
(0L,阵列(0.0,1.0,0.0)),
(0L,阵列(0.0,0.0,1.0)))
){.MAP情况下(我,XS)=&GT; IndexedRow(ⅰ,Vectors.dense(XS))}VAL indexedRowMatrix =新IndexedRowMatrix(行) -
<$c$c>RowMatrix$c$c> - 类似于
IndexedRowMatrix
,但没有意义的行索引。可以直接从创建RDD [org.apache.spark.mllib.linalg.Vector]
进口org.apache.spark.mllib.linalg.distributed.RowMatrixVAL rowMatrix =新RowMatrix(rows.map(_。矢量))
-
<$c$c>BlockMatrix$c$c> - 从
RDD [((INT,INT),矩阵)来创建
其中,元组的第一个元素包含块,第二个坐标是本地org.apache.spark.mllib.linalg.Matrix
VAL眼= Matrices.sparse(
3,3,阵列(0,1,2,3),阵列(0,1,2),阵列(1,1,1))VAL块= sc.parallelize(SEQ(
((0,0),眼),((1,1),眼),((2,2),眼)))VAL分块矩阵=新分块矩阵(块3,3,9,9) -
<$c$c>CoordinateMatrix$c$c> - 从
创建RDD [MatrixEntry]
其中,<$c$c>MatrixEntry$c$c>包括行,列和价值。进口org.apache.spark.mllib.linalg.distributed {CoordinateMatrix,
MatrixEntry}VAL项= sc.parallelize(SEQ(
(0,0,3.0),(2,0,-5.0),(3,2,1.0),
(4,1,6.0),(6,2,2.0),(8,1,4.0))
).MAP {壳体(I,J,V)=&GT; MatrixEntry(I,J,V)}VAL coordinateMatrix =新CoordinateMatrix(条目,9,3)
由当地矩阵
前两种实现支持乘法:
VAL localMatrix = Matrices.dense(3,2,阵列(1.0,2.0,3.0,4.0,5.0,6.0))indexedRowMatrix.multiply(localMatrix).rows.collect
//阵列(IndexedRow(0,[1.0,4.0]),IndexedRow(0,[2.0,5.0]),
// IndexedRow(0,[3.0,6.0]))
和第三个可以通过一个乘以另一个分块矩阵
只要每块列在这个矩阵编号匹配每另一矩阵的块的行数。 CoordinateMatrix
不支持乘法,而是pretty容易创建和转换为其他类型的分布式矩阵:
blockMatrix.multiply(coordinateMatrix.toBlockMatrix(3,3))
每个类型都有自己的优点和缺点,另外还有一些其他因素需要考虑当您使用疏或密的元素(向量
或块矩阵
)。由本地矩阵乘法通常是preferable因为它不需要昂贵的改组。
您可以找到有关每个类型的更多细节。
I am trying to do matrix multiplication using Apache Spark and Java.
I have 2 main questions:
- How to create RDD that can represent matrix in Apache Spark?
- How to multiply two such RDD?
All depends on the input data and dimensions but generally speaking what you want is not a RDD
but one of the distributed data structures from org.apache.spark.mllib.linalg.distributed
. At this moment it provides four different implementations of the DistributedMatrix
IndexedRowMatrix
- can be created directly from aRDD[IndexedRow]
whereIndexedRow
consist of row index andorg.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.{Vectors, Matrices} import org.apache.spark.mllib.linalg.distributed.{IndexedRowMatrix, IndexedRow} val rows = sc.parallelize(Seq( (0L, Array(1.0, 0.0, 0.0)), (0L, Array(0.0, 1.0, 0.0)), (0L, Array(0.0, 0.0, 1.0))) ).map{case (i, xs) => IndexedRow(i, Vectors.dense(xs))} val indexedRowMatrix = new IndexedRowMatrix(rows)
RowMatrix
- similar toIndexedRowMatrix
but without meaningful row indices. Can be created directly fromRDD[org.apache.spark.mllib.linalg.Vector]
import org.apache.spark.mllib.linalg.distributed.RowMatrix val rowMatrix = new RowMatrix(rows.map(_.vector))
BlockMatrix
- can be created fromRDD[((Int, Int), Matrix)]
where first element of the tuple contains coordinates of the block and the second one is a localorg.apache.spark.mllib.linalg.Matrix
val eye = Matrices.sparse( 3, 3, Array(0, 1, 2, 3), Array(0, 1, 2), Array(1, 1, 1)) val blocks = sc.parallelize(Seq( ((0, 0), eye), ((1, 1), eye), ((2, 2), eye))) val blockMatrix = new BlockMatrix(blocks, 3, 3, 9, 9)
CoordinateMatrix
- can be created fromRDD[MatrixEntry]
whereMatrixEntry
consist of row, column and value.import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry} val entries = sc.parallelize(Seq( (0, 0, 3.0), (2, 0, -5.0), (3, 2, 1.0), (4, 1, 6.0), (6, 2, 2.0), (8, 1, 4.0)) ).map{case (i, j, v) => MatrixEntry(i, j, v)} val coordinateMatrix = new CoordinateMatrix(entries, 9, 3)
First two implementations support multiplication by a local Matrix
:
val localMatrix = Matrices.dense(3, 2, Array(1.0, 2.0, 3.0, 4.0, 5.0, 6.0))
indexedRowMatrix.multiply(localMatrix).rows.collect
// Array(IndexedRow(0,[1.0,4.0]), IndexedRow(0,[2.0,5.0]),
// IndexedRow(0,[3.0,6.0]))
and the third one can be multiplied by an another BlockMatrix
as long as number of columns per block in this matrix matches number of rows per block of the other matrix. CoordinateMatrix
doesn't support multiplications but is pretty easy to create and transform to other types of distributed matrices:
blockMatrix.multiply(coordinateMatrix.toBlockMatrix(3, 3))
Each type has its own strong and weak sides and there are some additional factors to consider when you use sparse or dense elements (Vectors
or block Matrices
). Multiplying by a local matrix is usually preferable since it doesn't require expensive shuffling.
You can find more details about each type in the MLlib Data Types guide.
这篇关于矩阵乘法在Apache中星火的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!