我想在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循环中创建的。有什么想法怎么做?
答案 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
类型。