火花累加器计数不正确?

时间:2017-05-26 10:53:07

标签: scala apache-spark accumulator

使用Spark 2.1,我有一个函数,它接受DataFrame并检查所有记录是否都在给定的数据库上(在这种情况下是Aerospike)。

看起来非常像这样:

def check(df: DataFrame): Long = {
    val finalResult = df.sparkSession.sparkContext.longAccumulator("finalResult")
    df.rdd.foreachPartition(iter => {
        val success = //if record is on the database: 1 else: 0 
        //if success = 0, send Slack message with missing record
        finalResult.add(success)
       }
      df.count - finalResult.value
    }

因此,Slack消息的数量应该与函数返回的数量匹配(缺失记录的总数),但通常情况并非如此 - 例如,我得到一条Slack消息,但是check = 2 。重新运行它提供check = 1

任何想法发生了什么?

1 个答案:

答案 0 :(得分:-1)

Spark可以针对不同工作人员的相同数据多次运行方法,这意味着您计算每次成功*在任何工作人员上处理数据的次数。因此,对于相同数据的不同传递,您可以在累加器中获得不同的结果。

在这种情况下,您不能使用累加器来获得准确的计数。抱歉。 :(