Spark:分布式删除/添加元素中的元素?

时间:2016-02-19 22:28:21

标签: scala apache-spark

我正在尝试将ML算法转换为Spark Scala以利用我的群集功能。伪代码的相关位如下:

initialize set of elements

while(set not empty) {

  while(...) { remove a given element from the set }

  while(...) { add a given element to the set }

}

有没有办法并行化这样的事情?

我会直观地说这不是以分布式方式实现的(迭代次数未知),但我一直在阅读Spark允许实现迭代ML算法。

这是我到目前为止所尝试的内容:

  • 最初在简单Scala的循环中使用了一个可变的Set和删除/添加的元素。它运行正常,但我觉得整个代码只会在驱动程序上执行,这限制了使用Spark的兴趣?
  • 使集合成为RDD,并在每次迭代期间用一个带有减去/添加元素的新RDD替换var(我认为它是超重的?)。没有出现错误,但变量实际上没有更新。

    mySetRDD = mySetRDD.subtract(sc.parallelize(Seq(element)))

  • 查找累加器,以便在多个执行程序中保持一组元素的内容(元素的存在/缺失),但它们似乎不允许除数值的简单更新之外的其他内容。 / p>

1 个答案:

答案 0 :(得分:0)

创建PairRDD然后repartitionByKey说x分区。 之后你可以使用

PairRdd1.zipPartition()通过rdds的分区获取迭代器。然后你可以编写一个函数,它将在两个迭代器上工作,产生第三个或输出迭代器。

由于您已按键重新分区rdd,因此无需跟踪分区之间的删除。

https://spark.apache.org/docs/1.0.2/api/java/org/apache/spark/rdd/RDD.html#zipPartitions(org.apache.spark.rdd.RDD,boolean,scala.Function2,scala.reflect.ClassTag,scala.reflect.ClassTag)