如何在spark中迭代flatmap

时间:2018-03-20 11:06:50

标签: scala apache-spark

我想在Spark中运行for循环中的flatMap:

def clusterVar(points: DStream[ArrayBuffer[Double]]): DStream[ArrayBuffer[Double]]={
var best = new ArrayBuffer[Double]()
var bestVarianceSum = Double.PositiveInfinity
for (i <- 0 until numTrials) { 
    val clusters = cluster(points)
    // compute the variance of the current list
    clusters.flatMap(cl => {
      val varianceSum = score(cl)
      if (varianceSum < bestVarianceSum) { 
        best.appendAll(cl)
        bestVarianceSum = varianceSum
      }
      best
    })
  }
//return value: clusters:DStream[ArrayBuffer[Double]]
}

但我不知道如何返回群集dstream,因为它是在for循环中创建的。有什么想法怎么做?

1 个答案:

答案 0 :(得分:1)

通常,要从for循环中获取数据,需要使用yield。这是示例代码。

object SOF {
    def main(args: Array[String]): Unit = {
        val x = for (i <- 1 to 5) yield i
        x.foreach(println)
    }
}

输出:12345

此处变量x变为IndexedSeq[Int]类型。在你的情况下,为了获得变量clusters,你需要保持你的循环。

val final_data = for (i <- 0 until numTrials) yield { 
    val clusters = cluster(points)
    // compute the variance of the current list
    clusters.flatMap(cl => {
      val varianceSum = score(cl)
      if (varianceSum < bestVarianceSum) { 
        best.appendAll(cl)
        bestVarianceSum = varianceSum
      }
      best
    })
  }
clusters
 }

变量final_data变为IndexedSed[T]类型。 T属于您的变量clusters类型。