使用var过滤RDD的意外行为

Ant*_*n.P 2 scala apache-spark

我在我的代码中遇到了一个奇怪的错误,在调试时我能够改进问题.问题是,当我var使用var变量过滤RDD 然后将过滤器结果存储在相同的RDD中时,RDD会正确更新.事情是,我更新var变量后,我用来过滤结果,我再次自动过滤!

示例代码:

var filter = 5
var a1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9))
a1 = a1.filter(t => !t.equals(filter))
a1.foreach(println) // result is: 1-9 without 5
filter = filter + 1
a1.foreach(println) // result is: 1-9 without 6
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么这个规则不会导致我的代码中出现错误?

Yuv*_*kov 6

Spark变换被懒惰地评估.当你这样做时a1.filter,你会得到一个FilteredRDD,你实际上并没有在那个时间点得到计算结果.只有当您使用转换请求和操作时foreach,才会调用转换.

除了延迟过滤之外,lambda表达式还捕获变量,而不是值.这意味着当您更新时filter,捕获的lambda中的相同变量将从5更新为6,然后再次过滤它会生成具有更新值的所有元素.