在不使用collect的情况下迭代spark数据帧的每一行

时间:2019-03-01 03:18:00

标签: apache-spark dataframe

我想在不使用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) }

如何在数据框的每一行上执行自定义功能“测试”而不使用收集

1 个答案:

答案 0 :(得分:0)

根据foreach的Spark文档:

“注意:在foreach()之外修改除累加器以外的变量可能会导致不确定的行为。有关更多详细信息,请参见了解闭包。”

https://spark.apache.org/docs/latest/rdd-programming-guide.html#actions