lambda 中的 Java 8 变量范围(Spark 特定)

标签 java apache-spark lambda scope

我想用字符串作为键和行作为值填充 map ,我的代码:

private Map<String,Row> getMapFromDataset(Dataset<Row> dataset, List<String> mapColumns) {
    Map<String, Row> map = new HashMap<>();
    dataset.foreach((ForeachFunction<Row>) row ->
        map.put(getKey(mapColumns,row),row) //This works
    );
    return map; //Map is empty when returning!
}

我的 getKey() 方法(尽管我认为不是问题的原因):

private String getKey(List<String> mapColumns, Row row) {
    StringBuffer sb = new StringBuffer(256);
    for(String col : mapColumns){
      sb.append((String)row.getAs(col));
    }
    return sb.toString();
}

虽然编译和运行没有错误,但 map 始终是空的。
我注意到,如果我在第一次插入后立即检查 map 的大小,则 map 的大小为 1,因此项目插入有效,但返回的 map 为空
我还读到 lambda 中使用的变量应该是最终的,这可能可以解释问题。 有什么提示吗?

最佳答案

我发现映射初始化发生在 Driver 中,而 lambdas foreach 被发送到执行器。

关于lambda 中的 Java 8 变量范围(Spark 特定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729640/

相关文章:

hadoop - Spark HistoryServer 未启动

java - NoSuchElementException : next on empty iterator in MapPartitionsToPair-Spark

c++ - clang++ 3.1 但在 Lion Xcode 4.3.3 上没有 `cxx_lambdas`

C++;使用 lambda 有条件地扩展类中的函数(MWE 的段错误)

Java封装的Array mutator方法

java - 从线程创建 Intent

java - Java 中的类

scala - Windows机器上的spark scala

python - 如何用一行代码解释filter和lambda的功能?

java - 如何使用数据库管理器调用 Hsqldb 中的过程?