spark之累加器和广播变量

spark之累加器和广播变量

spark的三大数据结构
RDD:分布式数据集
广播变量:分布式只读共享变量
累加器:分布式只写共享变量

1.累加器

默认累加器
例子:对一个list中的所有值进行相加
在这里插入图片描述
首先上图中红色部分框出来的代码,看上去逻辑没有什么大问题,但是输出的结果sum=0。这是因为,sum在Driver中被定义,在不同的executor中计算,每个executor得到值既不能彼此相加,也不能传回Driver输出,所以导致Driver中sum的值一直没有变过。
这时候就可以采用累加器,因为Driver和各个executor都需要使用这个数据,所以在这里定义一个只写共享变量是合适的。累加器解决的问题就是数据原本不能从executor传回driver的问题。

自定义累加器
例子:取出含有"u"的字符串,累加

  • 继承AccumulatorV2
  • 重写方法
class WordAccumulator extends AccumulatorV2[String,util.ArrayList[String]]{
  val list = new util.ArrayList[String]()
  //判断累加器是否为初始化状态
  override def isZero: Boolean = {
    list.isEmpty
  }

  //复制累加器对象
  override def copy(): AccumulatorV2[String, util.ArrayList[String]] = {
    new WordAccumulator()
  }

  //重置累加器
  override def reset(): Unit = {
    list.clear()
  }

  //实现累加器的逻辑
  override def add(v: String): Unit = {
    if(v.contains("u")){
      list.add(v)
    }
  }
  //合并累加器
  override def merge(other: AccumulatorV2[String, util.ArrayList[String]]): Unit = {
    list.addAll(other.value)
  }

  //获取累加器的结果
  override def value: util.ArrayList[String] = list

}
  • 创建累加器
    要记得注册
//创建spark上下文对象
    val sc = new SparkContext(config)

    val value = sc.makeRDD(List("us","tomoon","oneus","you","loc"))

    val accumulator = new WordAccumulator
    //需要注册一下
    sc.register(accumulator)
    value.foreach {
      case i => {
        accumulator.add(i)
      }
    }
    println(accumulator.value)
    sc.stop()
2.广播变量

使用的时候只要把原本的数据通过broadcast()转化成广播变量,使用的时候通过broadcast.value使用即可。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值