编程语言
首页 > 编程语言> > 在Java Spark中迭代大型数据集的最快,有效方法

在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