我想在不使用collect的情况下迭代数据帧的每一行。这是我当前的实现:
val df = spark.read.csv("/tmp/s0v00fc/test_dir")
import scala.collection.mutable.Map
var m1 = Map[Int, Int]()
var m4 = Map[Int, Int]()
var j = 1
def Test(m:Int, n:Int):Unit = {
if (!m1.contains(m)) {
m1 += (m -> j)
m4 += (j -> m)
j += 1
}
if (!m1.contains(n)) {
m1 += (n -> j)
m4 += (j -> n)
j += 1
}
df.foreach { row => Test(row(0).toString.toInt, row(1).toString.toInt) }
这没有给出任何错误,但是m1和m4仍然为空。如果执行如下所示的df.collect,我可以获得预期的结果-
df.collect.foreach { row => Test(row(0).toString.toInt, row(1).toString.toInt) }
如何在数据框的每一行上执行自定义功能“测试”而不使用收集
答案 0 :(得分:0)
根据foreach的Spark文档:
“注意:在foreach()之外修改除累加器以外的变量可能会导致不确定的行为。有关更多详细信息,请参见了解闭包。”
https://spark.apache.org/docs/latest/rdd-programming-guide.html#actions