我写了一个方法,它接受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本身的延迟执行,这就是为什么我添加了collect方法,因为一个动作应该触发先前转换的执行。请注意,它不应该在最终版本中,因为其他方法将对数据集执行操作。
我甚至在地图部分添加了跟踪日志,它们永远不会被记录,调试器不会进入它,当然也不会执行功能。
所以,问题是,我在这里错过了什么?为什么这张地图 - &gt;收集与其他类似电话不同的电话?
答案 0 :(得分:3)
您忽略了matrixEntries.map(...)
调用的结果,因此Spark甚至没有尝试构建结果。如果您不需要对原始矩阵的引用,则应编写matrixEntries = matrixEntries.map(...)
。