永远不会执行map函数

时间:2016-11-06 08:59:25

标签: java apache-spark

我写了一个方法,它接受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;收集与其他类似电话不同的电话?

1 个答案:

答案 0 :(得分:3)

您忽略了matrixEntries.map(...)调用的结果,因此Spark甚至没有尝试构建结果。如果您不需要对原始矩阵的引用,则应编写matrixEntries = matrixEntries.map(...)