我正在使用以下方法将spark数据集转换为哈希图列表, 我的最终目标是建立json对象列表或hashmaps列表 我正在320万行上运行此代码
List<HashMap> finalJsonMap = new ArrayList<HashMap>();
srcData.foreachPartition(new ForeachPartitionFunction<Row>() {
public void call(Iterator<Row> t) throws Exception {
while (t.hasNext()){
Row eachRow = t.next();
HashMap rowMap = new HashMap();
for(int j = 0; j < grpdColNames.size(); j++) {
rowMap.put(grpdColNames.get(j), eachRow.getString(j));
}
finalJsonMap.add(rowMap);
}
}
});
迭代工作正常,但是我无法将rowMap添加到finalJsonMap。
执行此操作的最佳方法是什么?
答案 0 :(得分:3)
这实际上不是Spark的工作方式。
放在foreachPartition
中的代码在与原始代码不同的上下文中执行
List<HashMap> finalJsonMap = new ArrayList<HashMap>();
在这种设置中,您能做的就是修改本地副本。
关于堆栈溢出已对此进行了多次讨论,并在official documentation in the Understanding Closures部分中进行了详细说明。
考虑所需的结果(即本地集合),实际上除了将代码转换为使用mapPartitions
和collect
之外,您无能为力。但是,这在Spark中几乎不是高效的或惯用的。
强烈建议您重新考虑当前的设计。