Spark累加器

在这里插入图片描述i+=1在Excutor端执行,var i = 0和println(i)在Driver端执行。collect算子虽然能够回收结果,但是并不代表它啥都能回收。所以打印出来的依旧是Driver端定义的i。

错误代码:

//打印出来的总是0
val session = SparkSession.builder().appName("broadcast").master("local").getOrCreate()
val sc = session.sparkContext

val lines = sc.textFile("data/words")
var i=0;
val rdd = lines.map(one => {
  i += 1
  one
})
rdd.collect()
println(i)

于是就有了累加器,在计算结束之后,把各个分区的计算结果收集一下到Driver端,再做累加。累加器在Driver端定义、初始化,在Executor端更新(1.6版本在Executor不能accumulator.value获取累加器的值)

定义累加器:

val accumulator = sc.longAccumulator

通过累加器,就能够收集到Executor分区的计算结果到Driver端,并累加。

完整代码如下:

	val session = SparkSession.builder().appName("broadcast").master("local").getOrCreate()
    val sc = session.sparkContext

    val accumulator = sc.longAccumulator
    val lines = sc.textFile("data/words")
    var i=0;
    val rdd = lines.map(one => {
//      i += 1
      accumulator.add(1)
      println(accumulator)
      one
    })
    rdd.collect()
    println(accumulator.value)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值