更新dtaframe.map函数

时间:2017-03-27 09:56:52

标签: scala apache-spark transformation accumulator

我无法在dataframe.map函数中更新累加器值。 PFB代码相同。

case class TestPerson(name: String, age: Long, salary: Double)

val tom = TestPerson("Tom Hanks",37,35.5)
val sam = TestPerson("Sam Smith",40,40.5)
val stev = TestPerson("Stev Smith",45,30.5)

val PersonList = scala.collection.mutable.MutableList[TestPerson]()

PersonList += tom
PersonList += sam
PersonList += stev

val personDF = PersonList.toDF()

class ListAccumulatorParam[B] extends AccumulatorParam[List[Row]] {

  def zero(initialValue: List[Row]): List[Row] = {
    List.empty
  }

  def addInPlace(l1: List[Row],l2: List[Row]): List[Row] = {
    l1 ::: l2
  }  
}

var listAccum = sc.accumulator(List[Row]())(new ListAccumulatorParam[Row]())
personDF.map { row => listAccum += List(row)}

listAccum变得空白。

但同时如果我做并行化然后检查值已在累加器中更新。         sc.parallelize(personDF.collect())。foreach(row => listAccum + = List(row))

实际用例是我想在同一行上执行更多操作..如果该操作失败,那么我想要那组行返回...这就是我希望那些行在累加器中的原因。

我是否以错误的方式做某事,因为该列表会变得空白?

1 个答案:

答案 0 :(得分:2)

我没有采取任何行动,因为它没有给予任何价值。

找到When are accumulators truly reliable?