我在我的代码中遇到了一个奇怪的错误,在调试时我能够改进这个问题。问题是,当我使用 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
为什么会这样?这不会在我的代码中引起错误的规则是什么?
最佳答案
Spark 转换是惰性评估的。当你执行 a1.filter
时,你会得到一个 FilteredRDD
,你实际上并没有那个时间点的计算结果 .只有当您使用 foreach
请求和操作转换时,才会调用转换。
与惰性过滤一样,lambda 表达式捕获变量,而不是值。这意味着当您更新 filter
时,捕获的 lambda 中的相同变量从 5 更新为 6,然后再次过滤它会产生所有具有更新值的元素。
关于scala - 使用 var 过滤 RDD 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431812/