2016-11-06 89 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(...)