斯卡拉.映射后的空变量



我是 Scala 的新手,显然不明白为什么这段代码不起作用。

我从第一个数据帧创建数组,并在创建第二个数组时开始检查两个数组中的相同数据。在数据相同的情况下 - 实现可变文本

var text = "Hello!"
val dfOriginDate = sqlContext.sql("SELECT name, age FROM table2")
val arrOriginDate = dfOriginDate.rdd.map(r => {
     r(0).toString + r(1).toString
   }).collect()
val dfNewDate = sqlContext.sql("SELECT name, age FROM table")
dfNewDate.rdd.map(r => {
  if (arrOriginDate contains(r(0).toString + r(1).toString)) {
    text += "found some stupid things"
    print(text + " for the first timern")
  }
}).collect()
println(text + " for the second time")

在输出上,我有这个:

Hello! found some stupid things for the first time
Hello! for the second time

为什么当我在映射变量实现时打印文本时,但是当我在 Map 之后再次打印它时 - 似乎它从未在 Map 中出现过?

__

当我尝试用ListBuffer[String]()做这件事时,它给了我同样的效果。

我试图用这段代码做什么 - 在 Cassandra 的不同表中查找相同的数据__不知道什么答案更好><两者都可以接受我的问题>

你编写rdd.map的函数在后端做了大量的事情。您看到此行为的原因是您的主代码和 rdd.map 函数在不同的线程中工作。变量不能简单地在并行上下文的情况下传递和返回。

为此尝试使用累加器。这就是为什么从不建议使用可变变量的原因。它会让你感到困惑,如果它们是不可变的,你不应该被困住。

这不是关于Scala的,而是一个专门的Spark问题。你不能使用这样的可变变量,因为传递给map的匿名函数中的代码将在其他机器上执行(这就是使用Spark的意义所在!),并且会更改它们的text副本,而不是驱动程序中的副本。

它通过一个非常相似的例子 http://spark.apache.org/docs/latest/programming-guide.html#understanding-closures-a-nameclosureslinka 进行了详细解释。

相关内容

  • 没有找到相关文章

最新更新