在Java Spark中迭代大型数据集的最快,有效方法

时间:2019-01-19 05:34:03

标签: java apache-spark iteration apache-spark-dataset

我正在使用以下方法将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。

执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

这实际上不是Spark的工作方式。

放在foreachPartition中的代码在与原始代码不同的上下文中执行

List<HashMap> finalJsonMap = new ArrayList<HashMap>();

在这种设置中,您能做的就是修改本地副本。

关于堆栈溢出已对此进行了多次讨论,并在official documentation in the Understanding Closures部分中进行了详细说明。

考虑所需的结果(即本地集合),实际上除了将代码转换为使用mapPartitionscollect之外,您无能为力。但是,这在Spark中几乎不是高效的或惯用的。

强烈建议您重新考虑当前的设计。