Apache spark 如何使用spark实现矩阵向量乘法?

Apache spark 如何使用spark实现矩阵向量乘法?,apache-spark,matrix-multiplication,Apache Spark,Matrix Multiplication,我有一个存储在元组中的矩阵 mat = RDD[(i-idx, j-idx, value)] vec = RDD[(idx, value)] 和元组中的向量 mat = RDD[(i-idx, j-idx, value)] vec = RDD[(idx, value)] 我想做mat*vec,我计划做的是: val map_mat = mat.map(x => (x._2, (x._1, x._3))) // Turn mat in to key-value pairs. val

我有一个存储在元组中的矩阵

mat = RDD[(i-idx, j-idx, value)]
vec = RDD[(idx, value)]
和元组中的向量

mat = RDD[(i-idx, j-idx, value)]
vec = RDD[(idx, value)]
我想做mat*vec,我计划做的是:

val map_mat = mat.map(x => (x._2, (x._1, x._3))) // Turn mat in to key-value pairs.
val join_mat = map_mat.join(vec) // Join the mat and vec on (j-idx == idx)
val mul_mat = join_mat.map(x => (x._2._1._1, x._2._1._2 * x._2._2))
val res_vec = mul_mat.reduceByKey(_ + _)
在每一个步骤之后,我应该得到:

join_mat: RDD[(j-idx, ((i-idx, value1), value2)]
mul_mat: RDD[(i-idx, value1 * value2)]
res_vec: RDD[(i-idx, sum(value1 * value2)]
它可能会工作,但我认为写这样的代码太糟糕了……尤其是mul_mat的语句

有没有更好的办法做这项工作?谢谢


我不想使用MLlib,MLlib没有实现坐标矩阵的矩阵复用,所以我必须自己实现它。

如果您只是想获得更好的语法,请使用模式匹配:
join_mat.map{case(,((x1,x2),y))=>(x1,x2*y)}
。然而,@zero323-answer看起来比特别的解决方案要好得多。如果您只是想要更好的语法,那么可以使用模式匹配:
join_mat.map{case(u,((x1,x2),y))=>(x1,x2*y)}
。然而,@zero323-answer看起来比即席解决方案要好得多。