所以这是我的代码:
var exceptions: String = ""
val count = failures.fold("0")((x1, x2) => {
println(s"x1: $x1 and x2: $x2")
if (x1 != "-433" && x2 != "-433") {
(x1.toInt + x2.toInt).toString
} else {
println(s"before: $exceptions")
exceptions = exceptions + ", " + "There is an exception in processing, check the logs of executors for actual information"
println(s"after: $exceptions")
if (x1 == "-433") {
if (x2 != "-433") {
x2
} else "0"
}else {
if (x2 == "-433") {
x1
}else "0"
}
}
})
count是RDD [String]。最令人好奇的是,作为""在末尾。这是日志:
x1:0和x2:-433
之前:
之后:,处理中有异常,检查执行程序的日志以获取实际信息
x1:0和x2:0
最终:
答案 0 :(得分:0)
Spark RDD是分布式数据结构,这意味着RDD的元素不会生活在同一个节点上,并且转换RDD不会发生在同一节点。
所有转换函数都包含在它们的闭包中,然后被序列化,然后发送到执行程序节点,在执行程序节点处反序列化,在执行程序节点处执行。包装封口得到"副本"使用过的上下文对象。
即使您在本地节点中运行spark,它也会在本地节点上运行多个执行程序,并且它们的行为方式相同。
因此,每个函数的执行都将获得自己的exceptions
变量副本。因此,您的exception
字符串永远不会以您期望的方式更新。