0

我使用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方法的返回值不同,但代碼保持不變。我不知道爲什麼,也不知道如何解決。誰能幫我?

回答

0

而不是自己實現乘法,考慮轉換爲BlockMatrix並使用提供的multiply方法。倍增後,轉換回CoordinateMatrix

def coordinateMatrixMultiply(leftMatrix: CoordinateMatrix, rightMatrix: CoordinateMatrix) = 
    leftMatrix.toBlockMatrix().multiply(rightMatrix.toBlockMatrix()).toCoordinateMatrix() 
+0

我得到這個異常: 異常在線程「主」 java.lang.IllegalArgumentException異常:要求失敗:A的列的數量和行數B必須相等。 A.numCols:159,B.numRows:51.如果您認爲它們應該相同,請嘗試在初始化時明確設置A和B的尺寸。 – Gao

+0

@Gao這聽起來像是輸入數據的問題。如果矩陣A中的列數和矩陣B中的行數相同,則只能執行矩陣乘法。你確定輸入始終保持不變嗎?也可能是因爲你需要切換'leftMatrix'和'rightMatrix'的位置,'multiply'方法取決於哪個矩陣分別位於左邊。 – Shaido

+0

我試圖用Matrix代替CoordinateMatrix再次嘗試:) – Gao