使用mllib时的矩阵乘法错误
问题描述:
我使用Spark 1.6与YARN,我有一个工作,使用Spark mllib
做一些计算,其中之一是矩阵乘法,我使用CoordinateMatrix
来做。该代码是这样的:使用mllib时的矩阵乘法错误
def coordinateMatrixMultiply(leftMatrix: CoordinateMatrix, rightMatrix: CoordinateMatrix): CoordinateMatrix = {
val M_ = leftMatrix.entries.map({ case MatrixEntry(i, j, v) => (j, (i, v)) })
val N_ = rightMatrix.entries.map({ case MatrixEntry(j, k, w) => (j, (k, w)) })
val productEntries = M_.join(N_)
.map({ case (_, ((i, v), (k, w))) => ((i, k), (v * w)) })
.reduceByKey(_ + _)
.map({ case ((i, k), sum) => MatrixEntry(i, k, sum) })
new CoordinateMatrix(productEntries)
}
但我得到了一个错误,它说:
java.lang.IllegalArgumentException: requirement failed: Both matrices must have the same number of rows. A.numRows: 159, B.numRows: 158
at scala.Predef$.require(Predef.scala:224)
at org.apache.spark.mllib.linalg.distributed.BlockMatrix.blockMap(BlockMatrix.scala:359)
at org.apache.spark.mllib.linalg.distributed.BlockMatrix.add(BlockMatrix.scala:397)
at com.sankuai.nlpml.kg.syn_sim.SynSim$.process(SynSim.scala:312)
at com.sankuai.nlpml.kg.syn_sim.SynSim$.main(SynSim.scala:365)
at com.sankuai.nlpml.kg.syn_sim.SynSim.main(SynSim.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:635)
我已经提交作业很多次,但不是所有得到这个例外。我调试了代码,发现coordinateMatrixMultiply
方法的返回值不同,但代码保持不变。我不知道为什么,也不知道如何解决。谁能帮我?
答
而不是自己实现乘法,考虑转换为BlockMatrix
并使用提供的multiply
方法。倍增后,转换回CoordinateMatrix
:
def coordinateMatrixMultiply(leftMatrix: CoordinateMatrix, rightMatrix: CoordinateMatrix) =
leftMatrix.toBlockMatrix().multiply(rightMatrix.toBlockMatrix()).toCoordinateMatrix()
我得到这个异常: 异常在线程“主” java.lang.IllegalArgumentException异常:要求失败:A的列的数量和行数B必须相等。 A.numCols:159,B.numRows:51.如果您认为它们应该相同,请尝试在初始化时明确设置A和B的尺寸。 – Gao
@Gao这听起来像是输入数据的问题。如果矩阵A中的列数和矩阵B中的行数相同,则只能执行矩阵乘法。你确定输入始终保持不变吗?也可能是因为你需要切换'leftMatrix'和'rightMatrix'的位置,'multiply'方法取决于哪个矩阵分别位于左边。 – Shaido
我试图用Matrix代替CoordinateMatrix再次尝试:) – Gao