通过删除“for循环”来优化scala-spark代码

时间:2016-04-26 21:51:50

标签: scala

我想优化此代码(scala spark)以删除for循环。我该怎么做?

var varianceExplained = Array[(Int,Double)]();
var varExplained = Array[(Double)]();//{This one contains double values assigned before}
var sums = 0.00
for(x<-0 to varExplained.length-1)
{sums =sums+varExplained(x) 
 varianceExplained +:= (x,sums)
}

2 个答案:

答案 0 :(得分:0)

不确定如何并行化依赖于其前面值的集合...只有我可以添加的是如何根据函数式编程最佳实践删除循环并使其成为递归函数。

  def go(acc: Array[(Int, Double)], iter: Int, sums: Double): Array[(Int, Double)] ={
    if (iter == varExplained.length)acc
    else {
      go((iter, sums+varExplained(iter)) +: acc, iter+1, sums+varExplained(iter))
    }
  }
  go(Array[(Int, Double)](), 0, 0)

答案 1 :(得分:0)

一种可能的解决方案是将for循环转换为map的转换。 您可以尝试以下方法:

val varianceExplained = varExplained.map(elem => (elem, sums+varExplained(elem)))

在这种情况下,您不需要 varianceExplained 数组。由于Array[(Int, Double)]操作,您获得了所需的map。我在工作中使用了类似的策略来提高我的代码效率。 另外,请尝试在代码中使用vals代替vars