首页 > 解决方案 > 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 中使用的变量应该是最终的,这可能解释了问题。有什么提示吗?

标签: javaapache-sparklambdascope

解决方案


我发现映射初始化发生在驱动程序中,而 lambdasforeach被发送到执行程序。


推荐阅读