RDD中的重复行

时间:2015-04-07 12:59:46

标签: caching apache-spark persist rdd

我在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,但仍然存在同样的问题。

你能帮帮我吗? 迈克尔

1 个答案:

答案 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