Scala 如何与RDD[(Int,Int)]映射进行比较?

Scala 如何与RDD[(Int,Int)]映射进行比较?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,作为一项练习,我正在使用Spark实现k-means。 为此,我需要在每个步骤上比较两个id->cluster\u id的映射。目前,我通过收集它们并将它们作为两个普通的scala地图进行比较来实现这一点 有没有一种方法可以同时做到这一点?值得吗 更新: 让我详细描述一下情况,从K-MEANS聚类算法开始(很简单) 从所有N点中随机选取K点,使其成为质心 将每个点指定给最近的质心(根据欧氏距离) 重新计算质心,按指定的质心对所有点进行分组,计算这些质心的平均值 如果重新计算生成的映射(obj_i

作为一项练习,我正在使用Spark实现k-means。 为此,我需要在每个步骤上比较两个
id->cluster\u id
的映射。目前,我通过收集它们并将它们作为两个普通的scala地图进行比较来实现这一点

有没有一种方法可以同时做到这一点?值得吗

更新:

让我详细描述一下情况,从K-MEANS聚类算法开始(很简单)

  • 从所有N点中随机选取K点,使其成为质心
  • 将每个点指定给最近的质心(根据欧氏距离)
  • 重新计算质心,按指定的质心对所有点进行分组,计算这些质心的平均值
  • 如果重新计算生成的映射(obj_id->质心_id)与上一步的映射不同,则重复步骤2-3

  • 第四步是个问题。我需要将上一步中的映射与现在的映射进行比较,这应该以某种方式并行进行,而不会对工作人员进行太多随机读取。

    我不确定“比较”它们是什么意思。你问题的答案真的取决于此!如果你能提供更多的细节,我会相应地编辑我的答案,但一般问题只能得到一般答案^_^

    如果您只需要测试相等性,它非常简单(并且与顺序无关,正如映射所预期的那样):

    如果您只想测试它们是否具有相同的键集但具有不同的映射(可能是因为您想测试更新步骤的终止),则可以直接将键作为迭代器或集合进行比较

    (x.keys == y.keySet) == true
    
    如果你的问题源于你的贴图太大,你想并行进行相等测试,事情就变得棘手了:你可以根据关键点进行对的分割,并在每个切片上进行并行检查:如果你所有的检查都是正的,那么你就有相等性。 您可以通过根据键值/散列将x和y分割成片并发送给不同的参与者(例如,如果您使用的是参与者),或者只是迭代x并在不同的参与者上检查该键的y值

    在这两种情况下,我认为这只有在以下情况下才有意义:a)您的两个映射不在同一进程的内存中,因此访问它们的速度慢且阻塞;b)您的比较不仅仅是值相等,还需要一些密集的计算,这可以从异步管道中受益

    请注意,我的回答假设您使用的是基本的、通用的映射结构。如果您有一些性能限制,您可能希望实现您自己的映射结构,以满足您的特定需求,即使很困难,也不太可能想象这样一种场景:库版本没有得到足够的优化,不能比您自己的做得更好

    编辑
    根据新的信息,我的答案仍然没有改变。只需将项拆分为x中的n个部分,并检查y中是否包含具有相同值的项。

    我为问题添加了一些细节。
    (x.keys == y.keySet) == true