斯卡拉。映射后的空变量
Scala. Empty variable after Mapping
我是 Scala 的新手,显然不明白为什么这段代码不起作用。
我从第一个 DataFrame 创建数组,并在创建第二个数组时开始检查两个数组中的相同数据。
如果数据相同 - 实现变量 text。
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 time\r\n")
}
}).collect()
println(text + " for the second time")
关于输出我有这个:
Hello! found some stupid things for the first time
Hello! for the second time
为什么当我正在打印 text 时映射变量正在执行,但是当我在 Map 之后再次打印它时 - 似乎它从未出现在 Map 中?
__
当我尝试使用 ListBuffer[String]()
执行此操作时,它给了我同样的效果。
我想用这段代码做什么 - 在 Cassandra 的不同表中找到相同的数据
__
不知道哪个答案更好><我的问题都可以接受=)
您编写的函数 rdd.map 在后端做了很多事情。您看到此行为的原因是因为您的主代码和 rdd.map 函数在不同的线程中工作。在并行上下文的情况下,变量不能简单地传递和返回。
为此尝试使用 accumulator。这就是为什么不建议使用可变变量的原因。如果它们是不可变的,它会让你在不应该被卡住的地方感到困惑。
这与 Scala 无关,这是一个专门针对 Spark 的问题。您不能像这样使用可变变量,因为传递给 map
的匿名函数中的代码将在其他机器上执行(这就是使用 Spark 的意义!)并且会更改 它们的 text
的副本,而不是驱动程序中的副本。
http://spark.apache.org/docs/latest/programming-guide.html#understanding-closures-a-nameclosureslinka 用一个非常相似的例子详细解释了它。
我是 Scala 的新手,显然不明白为什么这段代码不起作用。
我从第一个 DataFrame 创建数组,并在创建第二个数组时开始检查两个数组中的相同数据。 如果数据相同 - 实现变量 text。
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 time\r\n")
}
}).collect()
println(text + " for the second time")
关于输出我有这个:
Hello! found some stupid things for the first time
Hello! for the second time
为什么当我正在打印 text 时映射变量正在执行,但是当我在 Map 之后再次打印它时 - 似乎它从未出现在 Map 中?
__
当我尝试使用 ListBuffer[String]()
执行此操作时,它给了我同样的效果。
我想用这段代码做什么 - 在 Cassandra 的不同表中找到相同的数据 __ 不知道哪个答案更好><我的问题都可以接受=)
您编写的函数 rdd.map 在后端做了很多事情。您看到此行为的原因是因为您的主代码和 rdd.map 函数在不同的线程中工作。在并行上下文的情况下,变量不能简单地传递和返回。
为此尝试使用 accumulator。这就是为什么不建议使用可变变量的原因。如果它们是不可变的,它会让你在不应该被卡住的地方感到困惑。
这与 Scala 无关,这是一个专门针对 Spark 的问题。您不能像这样使用可变变量,因为传递给 map
的匿名函数中的代码将在其他机器上执行(这就是使用 Spark 的意义!)并且会更改 它们的 text
的副本,而不是驱动程序中的副本。
http://spark.apache.org/docs/latest/programming-guide.html#understanding-closures-a-nameclosureslinka 用一个非常相似的例子详细解释了它。