首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >乘2稀疏矩阵

乘2稀疏矩阵
EN

Stack Overflow用户
提问于 2017-10-24 03:31:57
回答 1查看 958关注 0票数 1

我想要乘两个来自文本文件的稀疏矩阵。我现在有这样的代码:

代码语言:javascript
复制
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf


@SerialVersionUID(123L)
case class M_Matrix ( i: Long, j: Long, v: Double )
extends Serializable {}

@SerialVersionUID(123L)
case class N_Matrix ( j: Long, k: Long, w: Double )
extends Serializable {}

object Multiply {
def main(args: Array[ String ]){
val conf = new SparkConf().setAppName("Multiply")
val sc = new SparkContext(conf)

val M_ = sc.textFile(args(0)).map( line => { val a = line.split(",")
  M_Matrix(a(0).toLong,a(1).toLong,a(2).toDouble) } )

val N_ = sc.textFile(args(1)).map( line => { val a = line.split(",")
  N_Matrix(a(0).toLong, a(1).toLong, a(2).toDouble) } )
val res = M_.map( M_ => (M_.j,M_) )
  .join(N_.map( N_ => (N_.j, N_)))
  .map({case (j, ((i,v),(k,w))) => ((i,k), v * w)})
  .reduceByKey(_ + _)
  .map({ case ((i,k), sum) => (i, k, sum)} )
res.saveAsTextFile(args(2))
sc.stop()
}
}

它给了我一个错误,在v* w中*不是一个有效的运算符。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-24 05:30:44

代码几乎是正确的,需要进行一些小的更改才能使其工作。具体来说,在对矩阵的map中,在join操作之前:

代码语言:javascript
复制
M_.map( M_ => (M_.j, (M_.i, M_.v))).join(N_.map(N_ => (N_.j, (N_.k, N_.w))))

这里应该使用元组作为值,因为在下一个语句中,

代码语言:javascript
复制
.map{ case(j, ((i,v),(k,w))) => ((i,k), v * w)}

我建议您尝试使用Spark中内置的功能,因为它应该更高效。可以从RDD[MatrixEntry]创建矩阵。首先创建两个矩阵:

代码语言:javascript
复制
import org.apache.spark.mllib.linalg.distributed.{BlockMatrix, CoordinateMatrix, MatrixEntry}

val M_ = sc.textFile(args(0)).map{ line => 
  val a = line.split(",")
  MatrixEntry(a(0).toLong, a(1).toLong, a(2).toDouble)
}

val N_ = sc.textFile(args(1)).map{ line => 
  val a = line.split(",")
  MatrixEntry(a(0).toLong, a(1).toLong, a(2).toDouble)
}

然后将它们转换为BlockMatrix

代码语言:javascript
复制
val matrix_M = new CoordinateMatrix(M_).toBlockMatrix()
val matrix_N = new CoordinateMatrix(N_).toBlockMatrix()

之后,您可以使用函数multiply将它们相乘。

代码语言:javascript
复制
val res = matrix_M.multiply(matrix_N)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46901755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档