Scala折叠为RDD [String]表现得很奇怪

时间:2018-05-22 13:37:32

标签: scala apache-spark fold

所以这是我的代码:

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

最终:

1 个答案:

答案 0 :(得分:0)

Spark RDD是分布式数据结构,这意味着RDD的元素不会生活在同一个节点上,并且转换RDD不会发生在同一节点。

所有转换函数都包含在它们的闭包中,然后被序列化,然后发送到执行程序节点,在执行程序节点处反序列化,在执行程序节点处执行。包装封口得到"副本"使用过的上下文对象。

即使您在本地节点中运行spark,它也会在本地节点上运行多个执行程序,并且它们的行为方式相同。

因此,每个函数的执行都将获得自己的exceptions变量副本。因此,您的exception字符串永远不会以您期望的方式更新。