java - map 函数永远不会被执行

标签 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 原生的延迟执行,这就是我添加收集方法的原因,因为一个操作应该触发先前转换的执行。请注意,它不应该出现在最终版本中,因为其他方法将对数据集执行操作。

我什至在 map 部分添加了跟踪日志,但它们从未被记录,调试器也不会进入其中,当然该功能也不会执行。

所以,问题是,我在这里错过了什么?为什么这个map -> Collect call 与其他类似的不同?

最佳答案

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

关于java - map 函数永远不会被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447590/

相关文章:

java - 创建并使用 loadUserByEmail 而不是 loadUserByUsername

java - 验证 AspectJ 切入点语法

scala - 如何使用 spark-shell 导入自己的 scala 包?

apache-spark - 带有 --files 参数错误的 PySpark spark-submit 命令

scala - 将 Scala 代码部署到 Spark 时 ClassNotFoundException anonfun

apache-spark - Apache Spark应用程序部署最佳实践

java - 如何通过另一个面板更改CardLayout的一个面板

java - 从 Java 运行 Python 脚本

java - HttpClient 向 Jenkins 进行身份验证

apache-spark - 如何将 spark 参数传递给 dataproc 工作流模板?