我编写了一个方法,它采用 BlockMatrix 并将所有非 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();
}
问题是 map 函数从未被执行。我还没有将该方法与我的代码集成,但现在我只是对其运行 JUnit 测试。测试设置相当简单,BlockMatrix 是根据本地 Spark 上下文并行化的数据生成的,并馈送到该方法。
我知道 Spark 原生的延迟执行,这就是我添加收集方法的原因,因为一个操作应该触发先前转换的执行。请注意,它不应该出现在最终版本中,因为其他方法将对数据集执行操作。
我什至在 map 部分添加了跟踪日志,但它们从未被记录,调试器也不会进入其中,当然该功能也不会执行。
所以,问题是,我在这里错过了什么?为什么这个map -> Collect call 与其他类似的不同?
最佳答案
您忽略了matrixEntries.map(...)
调用的结果,因此Spark甚至不尝试构建结果。如果不需要原始矩阵的引用,则应编写matrixEntries = matrixEntries.map(...)
。
关于java - map 函数永远不会被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447590/