关于spark中累加器的一些注意事项

问题的引出:

需求:求取某一批数据个数(条数)
如图:假如有十条数据,当我们进行累加计算的时候,假设两个分区Executer进行计算得到5,但是Driver所记录的count和两个Executer计算的结果是无关,因此当我们最后调用collect()方法收集结果的时候,结果却显示0,这显然不符合我们的预想结果。因此便引出了Spark累加器。
在这里插入图片描述

Spark累加器的介绍:
使用方法(PySpark):将对象标记为累加器对象
语法

conf = SparkConf().setAppName("syx_test").setMaster("yarn")
sc = SparkContext(conf=conf)
#原先为 count = 0 ,括号的0代表初始值
acc_count = sc.accumulator(0) 

新的问题:
由于RDD是过程数据,也就是下一个RDD产生,上一个RDD就灭亡了,且RDD之间存在血缘关系。那么当出现新的RDD向上一个RDD重新调用的情况下,RDD就会去溯源(也就是返回第一步重新生成上一个RDD),随之而来的问题就是在这个溯源的过程中,我们定义的acc_count也就会再次累加一次,显然这也不是我们想要的结果。

解决方案:
将我们需要再次调用的RDD存入缓存或者checkpoint。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值