2016-11-06 93 views
2

我寫,需要一個分塊矩陣,並且設置不0到1地圖功能

public BlockMatrix SetNonZeroesToOnes(BlockMatrix matrix) 
{ 
    // initialize 
    JavaRDD<MatrixEntry> matrixEntries = matrix.toCoordinateMatrix().entries().toJavaRDD(); 

    // transformation 
    matrixEntries.map(t -> 
    { 
     if(t.value() != 0) 
     { 
      return new MatrixEntry(t.i(), t.j(), 1); 
     } 

     return new MatrixEntry(t.i(), t.j(), 0); 
    }); 

    // action 
    List<MatrixEntry> list = matrixEntries.collect(); 
    for (MatrixEntry matrixEntry : list) 
    { 
     System.out.println("(" + matrixEntry.i() + ", " + matrixEntry.j() + ") = " + matrixEntry.value()); 
    } 

    // return value 
    CoordinateMatrix coordMat = new CoordinateMatrix(matrixEntries.rdd(), matrix.numRows(), matrix.numCols()); 
    return coordMat.toBlockMatrix(); 
} 

的問題是,從不執行的地圖功能的所有值的方法。我還沒有得到將該方法與我的代碼集成,但現在我只是運行JUnit測試。測試設置非常簡單,BlockMatrix是由本地火花上下文並行處理並饋送到方法的數據生成的。

我知道Spark本身的惰性執行,這就是爲什麼我添加了collect方法,因爲一個動作應該觸發執行以前的轉換。請注意,它不應該在最終版本中,因爲其他方法將對數據集執行操作。

我甚至在地圖部分添加了跟蹤日誌,他們從不記錄,調試器將不會進入它,當然功能不會執行。

所以,問題是,我在這裏錯過了什麼?爲什麼這張地圖 - >收集的電話與其他類似的電話不同?

回答

3

您忽略了matrixEntries.map(...)調用的結果,因此Spark甚至不嘗試創建結果。如果你不需要參考原始矩陣,你應該寫matrixEntries = matrixEntries.map(...)