我在spark中遇到了以下问题:
...
while(...){
key = filtersIterator.next()
pricesOverLeadTimesKeyFiltered = pricesOverLeadTimesFilteredMap_cached
.filter(x => x._1.equals(key))
.values
resultSRB = processLinearBreakevens(pricesOverLeadTimesKeyFiltered)
resultsSRB = resultsSRB.union(resultSRB)
}
....
通过这种方式,我在resultsSRB中累积了相同的resultSRB。 但这里有一些"一些"允许我为每次迭代添加不同/正确的resultSRB的技巧
resultSRB.collect()
来电后致电resultSRB.foreach(println)
或println(resultSRB.count)
或processLinearBreakevens(..)
pricesOverLeadTimesKeyFiltered
processLinearBreakevens(..)
执行相同的操作
似乎我需要确保所有操作必须“刷新”#34;在执行工会之前。我已经通过临时变量尝试了联合,或者持久化了resultSRB,或者仍然存在pricesOverLeadTimesKeyFiltered
,但仍然存在同样的问题。
答案 0 :(得分:1)
如果我的假设是正确的;所有这些都是var
,那么问题就是关闭。 key
需要val
,因为它会被懒惰地捕获到您的filter
中。因此,当它最终被执行时,过滤总是使用key
我的例子:
def process(filtered : RDD[Int]) = filtered.map(x=> x+1)
var i = 1
var key = 1
var filtered = sc.parallelize(List[Int]())
var result = sc.parallelize(List[Int]())
var results = sc.parallelize(List[Int]())
val cached = sc.parallelize(1 to 1000).map(x=>(x, x)).persist
while(i <= 3){
key = i * 10
val filtered = cached
.filter(x => x._1.equals(key))
.values
val result = process(filtered)
results = results.union(result)
i = i + 1
}
results.collect
//expect 11,21,31 but get 31, 31, 31
要解决此问题,请在key
循环中将val
更改为while
并获得预期的11,21,31