【发布时间】:2021-12-23 03:29:33
【问题描述】:
上下文
我想遍历 Spark Dataset 并为每一行更新一个 HashMap。
这是我的代码:
// At this point, I have a my_dataset variable containing 300 000 rows and 10 columns
// - my_dataset.count() == 300 000
// - my_dataset.columns().length == 10
// Declare my HashMap
HashMap<String, Vector<String>> my_map = new HashMap<String, Vector<String>>();
// Initialize the map
for(String col : my_dataset.columns())
{
my_map.put(col, new Vector<String>());
}
// Iterate over the dataset and update the map
my_dataset.foreach( (ForeachFunction<Row>) row -> {
for(String col : my_map.KeySet())
{
my_map.get(col).add(row.get(row.fieldIndex(col)).toString());
}
});
问题
我的问题是 foreach 根本不迭代,lambda 永远不会执行,我不知道为什么。
我按照此处的说明实现了它:How to traverse/iterate a Dataset in Spark Java?
最后,尽管 Dataset 不是,所有内部向量都保持为空(因为它们被初始化)(查看给定代码示例中的第一个 cmets)。
我知道 foreach 永远不会迭代,因为我做了两个测试:
- 添加一个
AtomicInteger来计算迭代次数,使用incrementAndGet()方法在lambda 的开头将其递增。 => 计数器值在进程结束时保持0。 - 在 lambda 的开头打印一条调试消息。 => 消息永远不会显示。
我没有使用过 Java(更不用说使用 Java lambdas),所以我可能错过了一个重要的点,但我找不到什么。
【问题讨论】:
标签: java apache-spark lambda foreach apache-spark-dataset