在Java Spark中迭代大型数据集的最快,有效方法
作者:互联网
我正在使用以下方法将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中.
最好的方法是什么?
解决方法:
这实际上不是Spark的工作方式.
放入foreachPartition中的代码是在与原始上下文不同的上下文中执行的
List<HashMap> finalJsonMap = new ArrayList<HashMap>();
在这种设置中,您所能做的就是修改本地副本.
在堆栈溢出中对此进行了多次讨论,并在official documentation in the Understanding Closures部分中进行了详细描述.
考虑到所需的结果(即本地集合),除了将代码转换为使用mapPartitions并进行收集外,您实际上无能为力.但是,这在Spark中几乎不是有效的或惯用的.
我强烈建议您重新考虑当前的设计.
标签:apache-spark-dataset,apache-spark,iteration,java 来源: https://codeday.me/bug/20191108/2006931.html