Spark-自定义累加器-进行字符串拼接(代码及详细实现步骤)

看longAccumulator()方法源码里是val acc = new LongAccumulator然后用register(acc)在Spark中注册了累加器,进入ctrl+鼠标左键进入LongAccumulator,可以看到继承了AccumulatorV2[jl.Long, jl.Long],根据LongAccumulator来实现自定义累加器
实现类
//1.继承父类AccumulatorV2[IN,OUT](IN,OUT是Driver发到Executor的类型与Executor返回给Driver的类型)
//2.实现抽象方法
//3.创建累加器
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("h")){
      list.add(v)
    }
  }

  //合并累加器(不同executor返回会有个合并的过程)
  override def merge(other: AccumulatorV2[String, util.ArrayList[String]]): Unit = {
    list.addAll(other.value)
  }

  //获取累加器的结果
  override def value: util.ArrayList[String] = list
}
然后是main函数
  def main(args: Array[String]): Unit = {

  val conf = new SparkConf().setAppName("CheckPoint").setMaster("local")

  //创建上下文对象
  val sc = new SparkContext(conf)

  val dataRDD:RDD[String] = sc.makeRDD(List("chun1","chun2","chun3","chun4"),2)
  // TODO 创建累加器
   val wordAccumulator = new WordAccumulator()
  // TODO 注册累加器
  sc.register(wordAccumulator)

  dataRDD.foreach{
    case word=>{
      //TODO 执行累加器的累加功能
      wordAccumulator.add(word)
    }
  }

  //  TODO 获取累加结果
  println(wordAccumulator.value)
  
  }
结果:

[chun1, chun2, chun3, chun4]

完整代码

package date_9_23

import java.util

import org.apache.spark.rdd.RDD
import org.apache.spark.util.AccumulatorV2
import org.apache.spark.{SparkConf, SparkContext}

/**
 * 自定义累加器
 */
object Spark4_LongAccumulator {
  def main(args: Array[String]): Unit = {

  val conf = new SparkConf().setAppName("CheckPoint").setMaster("local")

  //创建上下文对象
  val sc = new SparkContext(conf)

  val dataRDD:RDD[String] = sc.makeRDD(List("chun1","chun2","chun3","chun4"),2)
  // TODO 创建累加器
   val wordAccumulator = new WordAccumulator()
  // TODO 注册累加器
  sc.register(wordAccumulator)

  dataRDD.foreach{
    case word=>{
      //TODO 执行累加器的累加功能
      wordAccumulator.add(word)
    }
  }

  //  TODO 获取累加结果
  println(wordAccumulator.value)

  }
}

//声明累加器
//1.继承父类AccumulatorV2[IN,OUT](IN,OUT是Driver发到Executor的类型与Executor返回给Driver的类型)
//2.实现抽象方法
//3.创建累加器
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("h")){
      list.add(v)
    }
  }

  //合并累加器(不同executor返回会有个合并的过程)
  override def merge(other: AccumulatorV2[String, util.ArrayList[String]]): Unit = {
    list.addAll(other.value)
  }

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值