Apache spark 可从Executor viz foreachPartition访问Spark驱动程序变量

Apache spark 可从Executor viz foreachPartition访问Spark驱动程序变量,apache-spark,Apache Spark,我正在尝试使用spark处理一些ID,并希望对每个批次进行重复数据消除 如果我的代码是 HashSet<String> uniqueID = new HashSet<>(); foreachPartition((VoidFunction<Iterator<T>>) idIterator -> { ... //add unique id if (!uniqueID.contains(id)){ uniqueID.add(id) } });

我正在尝试使用spark处理一些ID,并希望对每个批次进行重复数据消除

如果我的代码是

HashSet<String> uniqueID = new HashSet<>();
foreachPartition((VoidFunction<Iterator<T>>) idIterator -> {

...
//add unique id
if (!uniqueID.contains(id)){
uniqueID.add(id)
}
});
HashSet uniqueID=newhashset();
foreachPartition((VoidFunction)idIterator->{
...
//添加唯一id
如果(!uniqueID.contains(id)){
唯一标识。添加(标识)
}
});

在这种情况下,由于foreachpartition在工作节点上执行,但我在foreachpartition之外定义了我的哈希集,它还能工作吗?我知道按键reduce最适合处理这个问题,我正在修改它,但为了分析现有的代码行为,在foreachPartition中移动hashset,并根据您的注释,这种方法是可能的。不过,您需要进行分区,以便Id值位于同一分区中,而不是位于分区之上。在序列化错误时,它确实发生了-只是运行了一个检查以确保。此外,您的方法不适合并行处理的Spark方式。

是否要返回数据?不完全是,我将调用外部数据库。好的。你试过了吗?前段分区是无参数的,需要考虑串行化的问题。我认为您需要在编码方面更清楚。谢谢,但是对于当前的生产代码,如果我这样做,它是否仍然按预期执行哈希值?或者它根本不起作用?检查-根据您的方法,我刚才得到了序列化错误。