我是新手,我非常喜欢这项技术提供的可能性。我的问题是如何在不使用for循环的情况下为每个元素在RDD的其余部分上执行一个元素的操作。 这是我尝试使用for循环:
//RDD[Key:Int,Vector:(Double,Double)]
val rdd = data.map(x => (x.split(',')(0).toInt,Vectors.dense(x.split(',')(1).toDouble,x.split(',')(2).toDouble)))
for( ind <- 0 to rdd.count().toInt -1 ) {
val element1 = rdd.filter(x => x._1 == ind)
val vector1 = element1.first()._2
val rdd2 = rdd.map( x => {
var dist1 = Vectors.sqdist(x._2,vector1)
(x._1 , Math.sqrt(dist1))
})
}
感谢您的建议
答案 0 :(得分:2)
如果您正在寻找所有向量之间的距离,请使用rdd.cartesian
:
import org.apache.spark.mllib.linalg.Vectors
val rdd = sc.parallelize(Array("0,1.0,1.0","1,2.0,2.0","2,3.0,3.0"))
val r = rdd.map(x => x.split(","))
.map(y =>(y(0).toInt, Vectors.dense(y(1).toDouble, y(2).toDouble)))
val res = r.cartesian(r).map{ case (first, second) =>
((first._1, second._1),
Math.sqrt(Vectors.sqdist(first._2, second._2)))
}
然而,它计算相同矢量之间的距离,两次。 (首先(A,B)然后(B,A))