我们发现了重复问题,这是由于外部依赖关系被多次调用所引起的,该值大于RDD的实际大小。转换的结果是合并的RDD,其大小为==输入RDD大小,我怀疑这可能是问题无法发现且在线记录的解决方案很少的原因。我们尝试了几种方法,如下所述-
方法1:将mapPartitionsWithIndex函数与persistPartition = true一起使用,结果是相同的-重复数据。
方法2:另一个stackoverflow解决方案建议在mapPartition转换之前调用rdd.cache(),因为原因是由于延迟求值,并且缓存可以调用立即转换。这似乎解决了问题,但缓存导致其他与内存相关的异常。
rdd = rdd.mapPartitionsWithIndex(partitionFunction,true);
4节点集群中RDD大小为1000的spark工作者节点的结果
2019-08-11 13:48:47,487 [Executor任务启动worker-0] INFO-在分区3中找到215条记录 2019-08-11 13:48:47,634 [Executor任务启动worker-0] INFO-在分区0中找到203条记录 2019-08-11 13:49:44,472 [Executor任务启动worker-0] INFO-在分区2中找到177条记录 2019-08-11 13:49:46,252 [Executor任务启动worker-0] INFO-在分区4中找到201条记录 2019-08-11 13:49:44,537 [Executor任务启动worker-0] INFO-在分区0中找到203条记录 2019-08-11 13:48:47,170 [Executor任务启动worker-0] INFO-在分区1中找到204条记录 2019-08-11 13:48:47,410 [Executor任务启动worker-0] INFO-在分区2中找到177条记录 2019-08-11 13:49:16,875 [Executor任务启动worker-0]信息-在分区4中找到201条记录
跨分区的总记录:1581
社区有任何解决此问题的建议吗? TIA