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

我想用“字符串”作为键,将“行”作为值填充地图,我的代码:

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();
}

尽管它可以编译并运行无错误,但映射始终为空。
我注意到的是,如果我在第一次插入后立即检查地图的大小,则地图的大小为1,因此项目插入有效,但是返回的地图为空
我还阅读到lambda中使用的变量应该是最终变量,这可能可以解释问题。 有提示吗?

andys740813 回答:Lambda中的Java 8变量范围(特定于Spark)

我发现映射初始化发生在Driver中,而lambda foreach被发送给执行者。

本文链接:https://www.f2er.com/3152446.html

大家都在问