我正在尝试将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算法。
这是我到目前为止所尝试的内容:
使集合成为RDD,并在每次迭代期间用一个带有减去/添加元素的新RDD替换var(我认为它是超重的?)。没有出现错误,但变量实际上没有更新。
mySetRDD = mySetRDD.subtract(sc.parallelize(Seq(element)))
查找累加器,以便在多个执行程序中保持一组元素的内容(元素的存在/缺失),但它们似乎不允许除数值的简单更新之外的其他内容。 / p>
答案 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)