【问题标题】:How to avoid for loop with Spark?如何避免使用 Spark 的 for 循环?
【发布时间】:2015-04-17 21:12:08
【问题描述】:

我是 spark 新手,不了解 mapreduce 机制如何与 spark 一起工作。我有一个只有双打的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
}

感谢您的支持。

【问题讨论】:

    标签: scala for-loop apache-spark


    【解决方案1】:

    可以使用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)) }
    

    【讨论】:

      【解决方案2】:

      我不认为你为什么要尝试做那样的事情。您可以简单地按照以下方式执行此操作。

      val initialArray = Array( ( 1,Vectors.dense(1,2) ), ( 2,Vectors.dense(3,4) ),... )
      
      val firstVector = initialArray( 0 )
      
      val initialRdd = sc.parallelize( initialArray )
      
      val euclideanRdd = initialRdd.map( { case ( i, vec ) => ( i, euclidean( firstVector, vec ) ) } )
      

      我们定义了一个函数euclidean,它接受两个密集向量并返回欧几里得距离。

      【讨论】:

      • 不,“!用其他向量迭代。”,。这是在用第一个向量与所有其他向量进行欧几里德距离之后)
      • 这是什么意思....你的意思是你想要每个向量与其他向量的欧几里得距离?
      • 嗯......我先写了......但在我认为你只想要第一个向量之后改变了。但仍然......如果你想要......我认为@Shyamendra 提供了同样的东西。
      • 我不是 OP。但是 OP 的代码在所有行上提供循环,并为每个行计算 euclidiena 以及所有其他元素。
      • 嗯......正如我所说,我首先为笛卡尔写了答案......但后来有人评论说不然......我以为他是Op......改变了答案。如果 Op 想要笛卡尔坐标,那么另一个答案对他来说是完美的。
      猜你喜欢
      • 2023-03-27
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2019-06-24
      相关资源
      最近更新 更多