scala - Spark如何避免for循环?

标签 scala for-loop apache-spark

我是 Spark 新手,不明白 MapReduce 机制如何与 Spark 配合使用。我有一个只有 double 的 csv 文件,我想要的是用第一个向量与 rdd 的其余部分进行操作(计算欧几里得距离)。然后用其他向量进行迭代。除了这种方式之外还有其他方式吗?也许明智地使用笛卡尔积......

val rdd = sc.parallelize(Array((1,Vectors.dense(1,2)),(2,Vectors.dense(3,4),...)))
val array_vects = rdd.collect
val size = rdd.count
val emptyArray = Array((0,Vectors.dense(0))).tail
var rdd_rez = sc.parallelize(emptyArray)

for( ind <- 0 to size -1 ) {
   val vector = array_vects(ind)._2
   val rest = rdd.filter(x => x._1 != ind)
   val rdd_dist = rest.map( x => (x._1 , Vectors.sqdist(x._2,vector)))
   rdd_rez = rdd_rez ++ rdd_dist
}

感谢您的支持。

最佳答案

可以使用rdd.cartesian计算距离(所有向量对之间):

val rdd = sc.parallelize(Array((1,Vectors.dense(1,2)),
                               (2,Vectors.dense(3,4)),...))
val product = rdd.cartesian(rdd)

val result = product.filter{ case ((a, b), (c, d)) => a != c }
                    .map   { case ((a, b), (c, d)) => 
                                   (a, Vectors.sqdist(b, d)) }

关于scala - Spark如何避免for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29698108/

相关文章:

scala - 在哪里下载 Scala RPM 或 DEB 包?

c# - 检查 DateTime 是否大于另一个 DateTime 的正确方法

java - Spark 1.3.1 ClassNotFoundException 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)

scala - 为什么 Scala 集合没有任何人类可读的方法,如 .append、.push 等

scala - Scala 编程语言有哪些可用的解析器?

javascript - 反向 for 循环的 lodash 等价物是什么?

python - 使用 tkinter 在带有 for 语句的标签中显示图片,可以做到吗?

apache-spark - 使用聚合函数时发生 Spark 数据帧错误

java - Scala 中的 Spark UDF 用于提取相关数据

java - 如何从Elasticsearch读取数据到Spark?