使用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
。
任何想法发生了什么?
答案 0 :(得分:-1)
Spark可以针对不同工作人员的相同数据多次运行方法,这意味着您计算每次成功*在任何工作人员上处理数据的次数。因此,对于相同数据的不同传递,您可以在累加器中获得不同的结果。
在这种情况下,您不能使用累加器来获得准确的计数。抱歉。 :(