scala - 使用 var 过滤 RDD 的意外行为

标签 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

为什么会这样?这不会在我的代码中引起错误的规则是什么?

最佳答案

Spark 转换是惰性评估的。当你执行 a1.filter 时,你会得到一个 FilteredRDD,你实际上并没有那个时间点的计算结果 .只有当您使用 foreach 请求和操作转换时,才会调用转换。

与惰性过滤一样,lambda 表达式捕获变量,而不是值。这意味着当您更新 filter 时,捕获的 lambda 中的相同变量从 5 更新为 6,然后再次过滤它会产生所有具有更新值的元素。

关于scala - 使用 var 过滤 RDD 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431812/

相关文章:

scala - 事件应该在外部可变吗?

scala - 尝试创建 scala jar 时出现下载失败错误

apache-spark - 按窗口/滞后的 PySpark 数据帧条件

java - 捕获 Spark 驱动程序上的 Dataset foreachPartition() 函数中抛出的异常?

scala - 使用谓词下推连接两个数据集

java - 将数据集 <row> 预测中的 vector 数据类型 "probability"列转换为数组?

list - scala 可变 val 列表

Scala 隐式类限制

scala - 如何将包含值 0...n 的列添加到 Spark 中的现有数据帧?

apache-spark - 无法在 Amazon Keyspaces 上的表上写入