我正在使用Spark实现 k-means 作为练习。
为此,我需要在每个步骤中比较id -> cluster_id
的2个地图。目前我通过收集它们并比较两个普通scala地图来做到这一点。
有没有办法并行执行此操作?值得吗?
更新
让我详细描述一下情况,从K-MEANS聚类算法开始(很简单)
步骤#4是个问题。我需要将上一步的映射与现在的映射进行比较,这应该以某种方式并行完成,而不会对工作人员进行过多的随机读取。
答案 0 :(得分:1)
我不确定你的意思是什么"比较"他们。你问题的答案真的取决于那个!如果您可以提供更多详细信息,我会相应地编辑我的答案,但一般性问题只能产生一般答案^ _ ^
如果您只是需要测试相等性,那么它非常简单(并且与地图一样,与顺序无关):
val x = Map[Int, Int](1->2, 2->3)
val y = Map[Int, Int](2->3, 1->2)
(x == y) == true
如果您只想测试它们具有相同的键集但是具有不同的映射(可能是因为您想测试更新步骤的终止),您可以将这些键直接比较为迭代器或集合
(x.keys == y.keySet) == true
如果您的问题是由于您的地图太大并且您想要并行进行相等测试而引起的,那么事情变得棘手:您可以根据键对这些对进行拆分并对每个切片进行并行检查:如果你的所有检查都是肯定的,那么你就是平等的。 您可以通过根据键值/哈希在切片中分割x和y并发送给不同的actor(例如,如果您正在使用actor),或者只是迭代x并检查另一个actor的y值来执行此操作为那把钥匙。
在这两种情况下,我认为这只有在a)你的两张地图不在同一过程中时才有意义。内存,因此访问它们是缓慢和阻塞的,b)你的比较不只是值相等,但它需要一些可以从异步流水线中受益的强烈计算。
请注意,我已经假设您使用的是基本的通用地图结构。如果您有一些性能限制,您可能希望实现自己的地图结构,以满足您的特定需求,甚至很难想象一个情况下,库版本不会优化到足以做得比您自己更好。
修改强> 鉴于新信息,我的答案仍然没有改变。只需将按键散列分配的n个切片中的条目拆分,并检查y是否包含具有相同值的切片。