我分发了一系列计算,其中所有计算都依赖于Map中表示的数据。问题是,每一步都应该更新地图。
首先是数据集,RDD系列是:
Iterable[Long, RDD[(String, Iterable[(String, String), Int])]]
如果第一个Long是RDD的签名,则(String,String)元组是所有节点上所需的Map的键:
Map[(String, String), Double]
在每一步中,计算需要double值,然后使用Int值更新double值。
我知道累加器是只写的,在我的情况下不能用于读取和写入(我确实尝试使用localValue
读取数据但这不起作用)。
事情就在我的情况下,因为每个RDD都是依次处理的,我想知道是否还有一个能够帮助我使用累加器的黑客。目前我写了以下累加器:
val accMap = sc.accumulableCollection(scala.collection.mutable.HashMap[(String, String), Double]())
我想知道在每次计算RDD数据之后调用accMap.value
并使用广播变量分发地图是我能得到的最好的东西吗?我的问题是地图真的很大所以它不太可行,如果是这样的话,算法应该重新考虑。
基本上我的问题是我上面描述的问题是我能做的最好的事情是在每个连续的RDD上:使用累加器Map来累积分数并使用value
函数收集它在每次迭代时只是使用广播变量再次广播它?
编辑:将所有RDD添加到单个RDD对我来说是不可行的,因为数据集非常庞大。这就是我试图把它分成几个不相关的RDD的原因。