spark2.1.0自定义累加器AccumulatorV2的使用

【Spark原理系列】Accumulator累加器原理用法示例源码详解 阅读详情

类
类继承AccumulatorV2
class MyAccumulatorV2 extends AccumulatorV2[String, String]
覆写抽象方法:

/**
  * @author lcjasas
  * @version 1.0
  * @since 2017-01-14 10:19 AM.
  */
class MyAccumulatorV2 extends AccumulatorV2[String, String] {

  override def isZero: Boolean = ???

  override def copy(): AccumulatorV2[String, String] = ???

  override def reset(): Unit = ???

  override def add(v: String): Unit = ???

  override def merge(other: AccumulatorV2[String, String]): Unit = ???

  override def value: String = ???

}

isZero: 当AccumulatorV2中存在类似数据不存在这种问题时,是否结束程序。
copy: 拷贝一个新的AccumulatorV2
reset: 重置AccumulatorV2中的数据
add: 操作数据累加方法实现
merge: 合并数据
value: AccumulatorV2对外访问的数据结果

下面自定义一个累加器,实现一个字符串中的数据累加统计:

import cn.lcj.project1.utils.StringUtils
import org.apache.spark.util.AccumulatorV2
import org.slf4j.LoggerFactory

/**
  * @author lcjasas
  * @version 1.0
  * @since 2017-01-14 10:19 AM.
  */
class MyAccumulatorV2 extends AccumulatorV2[String, String] {

  private val log = LoggerFactory.getLogger("MyAccumulatorV2")

  var result = "user0=0|user1=0|user2=0|user3=0" // 初始值

  override def isZero: Boolean = {
    true
  }

  override def copy(): AccumulatorV2[String, String] = {
    val myAccumulator = new MyAccumulatorV2()
    myAccumulator.result = this.result
    myAccumulator
  }

  override def reset(): Unit = {
    result = "user0=0|user1=0|user2=0|user3=0"
  }

  override def add(v: String): Unit = {
    val v1 = result
    val v2 = v
    //    log.warn("v1 : " + v1 + " v2 : " + v2)
    if (StringUtils.isNotEmpty(v1) && StringUtils.isNotEmpty(v2)) {
      var newResult = ""
      // 从v1中,提取v2对应的值,并累加
      val oldValue = StringUtils.getFieldFromConcatString(v1, "\\|", v2)
      if (oldValue != null) {
        val newValue = oldValue.toInt + 1
        newResult = StringUtils.setFieldInConcatString(v1, "\\|", v2, String.valueOf(newValue))
      }
      result = newResult
    }
  }

  override def merge(other: AccumulatorV2[String, String]) = other match {
    case map: MyAccumulatorV2 =>
      result = other.value
    case _ =>
      throw new UnsupportedOperationException(
        s"Cannot merge ${this.getClass.getName} with ${other.getClass.getName}")
  }

  override def value: String = {
    result
  }

}

StringUtils中的方法

/**
    * 从拼接的字符串中提取字段
    *
    * @param str       字符串
    * @param delimiter 分隔符
    * @param field     字段
    * @return 字段值
    */
  def getFieldFromConcatString(str: String, delimiter: String, field: String): String = {
    val fields = str.split(delimiter)
    var result = "0"
    for (concatField <- fields) {
      if (concatField.split("=").length == 2) {
        val fieldName = concatField.split("=")(0)
        val fieldValue = concatField.split("=")(1)
        if (fieldName == field) {
          result = fieldValue
        }
      }
    }
    result
  }

    /**
      * 从拼接的字符串中给字段设置值
      *
      * @param str           字符串
      * @param delimiter     分隔符
      * @param field         字段名
      * @param newFieldValue 新的field值
      * @return 字段值
      */
    def setFieldInConcatString(str: String, delimiter: String, field: String, newFieldValue: String): String = {
      val fields = str.split(delimiter)

      val buffer = new StringBuffer("")
      for (item <- fields) {
        val fieldName = item.split("=")(0)
        if (fieldName == field) {
          val concatField = fieldName + "=" + newFieldValue
          buffer.append(concatField).append("|")
        } else {
          buffer.append(item).append("|")
        }
      }
      buffer.substring(0, buffer.length() - 1)
    }

  }

使用
在spark中使用:

    val accumulator = new MyAccumulatorV2()
    sc.register(accumulator)

需要注册,不然在运行过程中,会抛出一个序列化异常。

Spark 2.x 自定义累加器AccumulatorV2的使用 废除Spark2.x之后,之前的的accumulator被废除,用AccumulatorV2代替;更新增加创建并注册一个long accumulator, 从“0”开始,用“add”累加 def longAccumulator(name: String): LongAccumulator = { val acc = new LongAccumulator register(acc, 阅读详情

相关推荐

Spark 累加器

Spark 累加器

congge_study的博客 2万+

Spark 之 Accumulator 累加器

累加器:分布式只写变量(Executor端的task不能互相访问累加器的值)。 累加器对信息进行聚合。 累加器分布式情况是线程安全的

南风知我意 2019

Spark2中使用累加器、注意点以及实现自定义累加器.docx

累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。

spark2.x-Accumulator

Accumulator累加器 Accumulable简单值 结果类型和要合并的元素类型一样, 例如变量仅仅能“添加”到关联和交换操作 所以能在并行程序上有效支持 被用来实现计数器或者求和 spark原生支持数值类型的累加器,程序员可以自己添加新类型的支持 计数器被创建通过一个初始的V值,通过调用SparkContext.accumlator 运行在集群上的任务可以添加它通过+=操作符 ...

program哲学 2126

spark中用scala编写累加器小程序统计文章中空白行

spark中用scala编写累加器小程序统计指定文章中的空白行,然后通过split函数通过空格切分文章,输出到指定的目录中。

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0+1+2+3 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接存成.bat批处理文件再执行 还有就是中文问题,具体在代码里都说了。 代码 (环境Qt5.7.0) 这是mainwindow.h #ifndef MAINWINDOW_H #defin.

natural_Caduceus 1万+

Spark自定义AccumulatorV2

Spark自定义AccumulatorV2 1.概述### AccumulatorV2的简单使用与注意事项见上一遍博客https://blog.csdn.net/wtzhm/article/details/86481846 在实际开发中很多时候需要用到自定义Acummulator,Accumulator太多了,不便于维护,例如项目如果要出现一些逻辑上的变更,比如说,session数量的计算逻辑,...

zhm的博客 1041

Vue3多级路由缓存失效的深度解析与实战解决方案

本文深度解析了Vue3项目中多级路由下keep-alive缓存失效的根本原因,并提供了三种实战解决方案:通过路由扁平化根治问题、利用状态管理精细模拟缓存效果,以及借助keep-alive-vue3插件快速修复。文章旨在帮助开发者彻底理解Vue Router与keep-alive的协作机制,从而根据项目情况选择最佳策略,有效解决页面状态丢失的难题。

weixin_29015801的博客 285

spark 累加器

spark 累加器

qq_43192537的博客 3021

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5796

内网环境下的高德地图离线化实战:从瓦片下载到交互功能集成

本文详细介绍了在内网环境中部署离线高德地图的完整实战方案。针对军工、能源、金融等对网络隔离与数据安全有严格要求的场景,文章核心解决了离线地图的两大基石:地图瓦片数据的高效下载与本地化,以及高德地图JS API的获取与插件集成。通过具体代码示例,进一步讲解了如何实现地图初始化、海量点标注与聚合、自定义图标及框选查询等核心交互功能,并分享了内网部署的路径配置、性能优化及法律合规等关键注意事项,为开发者在封闭网络环境下构建稳定、可控的地图应用提供了清晰指南。

Apple的专栏 394

12_spark_core_累加器_自定义累加器

12_spark_core_累加器_自定义累加器自定义累加器总结 自定义累加器 自定义累加器类型的功能在1.X版本中就已经提供了,但是使用起来比较麻烦,在2.0版本后,累加器的易用性有了较大的改进,而且官方还提供了一个新的抽象类:AccumulatorV2来提供更加友好的自定义类型累加器的实现方式。 1)自定义累加器步骤 (1)继承AccumulatorV2,设定输入、输出泛型 (2)重写6个抽象方法 (3)使用自定义累加器需要注册::sc.register(累加器,“累加器名字”) 2)需求:自定义累加器

dxy 372

【入门AUTOSAR网络管理测试】CANoe测试T_WakeUp时间

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中T_WakeUp时间如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 2135

Spark 的 Accumulator与 AccumulatorV2

Spark 的 Accumulator 1.概述 Accumulator累加器能精确地统计数据的各种属性,eg:可以统计符合条件的session,在一段时间段内产生了多少次购买,统计出各种属性的数据。 2. 例子 def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster(&amp;amp;amp;quot;local[2]&amp;amp;amp;quot;)....

zhm的博客 2731

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2880

利用Dify构建文档内容的分析对比

本次主要做了一些workflow和Agent的应用实现,供大家参考。主要目的是为了进行两个内部报告文件的内容对比,特别是报告中的各类审批表、申请表、推荐表和流程对比,本地数据通过知识库方式分别加载到两个知识库中,编制工作流针对同一个问题进行知识库检索,之后将查询结果进行合并,再一起提交给LLM进行对比,最终将对比分析结果以markdown方式返回显示。主要包括如何构建知识库,如何设计workflow、如何将工作流发布为工具、如何设计提示词、如何在agent中引入前面发布的工具,最终通过agent实现与用户交

hhue2007的专栏 2525

(电商项目实战)Spark累加器AccumulatorV2

spark2.x AccumulatorV2(累加器) Spark2.x之后,之前的的accumulator被废除,用AccumulatorV2代替; 累加器(accumulator):Accumulator是仅仅被相关操作累加的变量,因此可以在并行中被有效地支持。它们可用于实现计数器(如MapReduce)或总和计数。 Accumulator是存在于Driver端的,从节点不断把值发到Dr...

开水烫鱼的博客 1018

Android 15.0 系统开机屏幕设置默认横屏显示

在15.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 719

Spark自定义累加器实现高效WordCount

该文章介绍了一个基于Apache Spark自定义累加器的单词计数实现。程序通过继承AccumulatorV2类,创建MyAccumulator自定义累加器来统计RDD中单词出现次数,核心包括主程序创建RDD、注册累加器、遍历累加等步骤,以及自定义类中的add、merge等关键方法实现。文章还解析了Spark累加器的工作原理(分布式聚合、线程安全等),对比了AccumulatorV2和V1的区别,并提出了扩展多词统计、线程安全优化等改进建议。最后总结了累加器适用于全局计数、分组统计等分布式聚合场景的特点。

渣渣盟的博客 2271

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spark2.10中使用累加器、注意点以及实现自定义累加器

累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。 累加器简单使用 Spark内置的提供了Long和Double类型的累加器。下面是一个简单的使用示例,在这个例子中我们在过滤掉RDD中奇数的同时进行计数,最后计算剩下整数的和。 val

古月慕南的代码世界 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

自定义Spark累加器

继续跟踪LongAccumulator这个类 可以看到,累加器底层其实是继承了AccumulatorV2这个方法,但是里面有两个类型参数,是什么东西呢?继续跟踪 最终是这个类型,也就是说,上面的两个参数也就是一个是输入,一个是输出 所以根据上面的源码可以知道,如果我们需要自定义自己的累加器的,只需要继承AccumulatorV2[IN, OUT] 这个类,然后重写其余的方法,自定义我们的逻辑即可 当创建完累加器之后,在使用的时候,spark是不知道我们自定义的累加器的,所有此

阿拉修 1231

Spark三大核心数据结构(二)——累加器 & 自定义累加器的使用原理

Spark的三大核心数据结构:RDD、累加器(只写不读)、广播变量(只读不写) 在spark应用程序中,我们经常会有这样的需求,如异常监控,调试,记录符合某特性的数据的数目,这种需求都需要用到计数器,如果一个变量不被声明为一个累加器,那么它将在被改变时不会再driver端进行全局汇总,即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后...

攻城狮Kevin 5003

Spark之自定义累加器

自定义累加器类型的功能在1.X版本中就已经提供了,但是使用起来比较麻烦,在2.0版本后,累加器的易用性有了较大的改进,而且官方还提供了一个新的抽象类:AccumulatorV2来提供更加友好的自定义类型累加器的实现方式。实现自定义类型累加器需要继承AccumulatorV2并至少覆写下例中出现的方法,下面这个累加器可以用于在程序运行过程中收集一些文本类信息,最终以Set[String]的形式返回。...

qq_43193797的博客 1025

Spark累加器|系统累加器|自定义累加器

累加器 累加器:分布式共享只写变量。(Task和Task之间不能读数据) 累加器用来对信息进行聚合,通常在向Spark传递函数时,比如使用map()函数或者用 filter()传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们想要...

SmallScorpion 982

spark的累加器和自定义累加器详解

累加器:分布式共享只写变量。(Executor和Executor之间不能读数据) 累加器用来把Executor端变量信息聚合到Driver端。在Driver中定义的一个变量,在Executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行合并计算。 累加器使用 (1)累加器定义(SparkContext.accumulator(initialValue)方法) val sum: LongAccumulator = sc.longA.

andy的博客 1654

Spark-累加器源码分析

1、通过SparkContext创建累加器(LongAccumulator、DoubleAccumulator、CollectionAccumulator)2、在Driver端注册累加器(累加器必须先注册再使用)(其实就是向全局Map中放入了该累加器)3、累加器从0开始计数,在每层Stage对应的Task结束时通过merge方法更新Driver端的累计器4、当一个Job跑完后我们就可以使用累加器变量了,如果是数值型可以拿到总和、累加次数、平均值,如果时集合型可以拿到一个数据序列。

lu070828的博客 1322
上一篇: spark-2.1.0安装
下一篇: JAVA进程与线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向往的生活Life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值