Spark中自定义累加器
通过继承AccumulatorV2可以实现自定义累加器。
官方案例可参考:http://spark.apache.org/docs/latest/rdd-programming-guide.html#accumulators
下面是我自己写的一个统计卡种数量的案例。
package com.shuai7boy.myscalacode
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.util.AccumulatorV2
case class Card(var card1Count: Int, var card2Count: Int)
class CalcCardCount extends AccumulatorV2[Card, Card] {
  var result = new Card(, )
  /** *
   * 判断,这个要和reset设定值一致
   *
   * @return
   */
  override def isZero: Boolean = {
    result.card1Count ==  && result.card2Count ==
  }
  /** *
   * 复制一个新的对象
   *
   * @return
   */
  override def copy(): AccumulatorV2[Card, Card] = {
    val newCalcCardCount = new CalcCardCount()
    newCalcCardCount.result = this.result
    newCalcCardCount
  }
  /** *
   * 重置每个分区的数值
   */
  override def reset(): Unit = {
    result.card1Count =
    result.card2Count =
  }
  /**
   * 每个分区累加自己的数值
   *
   * @param v
   */
  override def add(v: Card): Unit = {
    result.card1Count += v.card1Count
    result.card2Count += v.card2Count
  }
  /** *
   * 合并分区值,求得总值
   *
   * @param other
   */
  override def merge(other: AccumulatorV2[Card, Card]): Unit = other match {
    case o: CalcCardCount => {
      result.card1Count += o.result.card1Count
      result.card2Count += o.result.card2Count
    }
  }
  //返回结果
  override def value: Card = result
}
object CardCount {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("calcCardCountDemo").setMaster("local")
    val sc = new SparkContext(conf)
    val cc = new CalcCardCount
    sc.register(cc)
    val cardList = sc.parallelize(List[String]("card1 1", "card1 3", "card1 7", "card2 5", "card2 2"), )
    val cardMapRDD = cardList.map(card => {
      var cardInfo = new Card(, )
      card.split(" ")() match {
        case "card1" => cardInfo = Card(card.split(" ")().toInt, )
        case "card2" => cardInfo = Card(, card.split(" ")().toInt)
        case _ => Card(, )
      }
      cc.add(cardInfo)
    })
    cardMapRDD.count() //执行action,触发上面的累加操作
    println("card1总数量为:" + cc.result.card1Count + ",card2总数量为:" + cc.result.card2Count)
  }
}
打印结果是:
card1总数量为:,card2总数量为:
通过上面代码,就可以同时统计两个变量的值了,当然如果需要更多,可以扩展。默认的累加器只实现了一个。
Spark中自定义累加器的更多相关文章
- Spark中自定义累加器Accumulator
		
1. 自定义累加器 自定义累加器需要继承AccumulatorParam,实现addInPlace和zero方法. 例1:实现Long类型的累加器 object LongAccumulatorPara ...
 - 在Spark中自定义Kryo序列化输入输出API(转)
		
原文链接:在Spark中自定义Kryo序列化输入输出API 在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo serialization.在默认情况 ...
 - 【Spark篇】---Spark中广播变量和累加器
		
一.前述 Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量. 累机器相当于统筹大变量,常用于计数,统计. 二.具体原理 ...
 - Spark2.0自定义累加器
		
Spark2.0 自定义累加器 在2.0中使用自定义累加器需要继承AccumulatorV2这个抽象类,同时必须对以下6个方法进行实现: 1.reset 方法: 将累加器进行重置; abstract ...
 - Spark中的编程模型
		
1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...
 - Spark中的键值对操作-scala
		
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
 - Spark中的键值对操作
		
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
 - spark 中的RDD编程 -以下基于Java api
		
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
 - Spark笔记之累加器(Accumulator)
		
一.累加器简介 在Spark中如果想在Task计算的时候统计某些事件的数量,使用filter/reduce也可以,但是使用累加器是一种更方便的方式,累加器一个比较经典的应用场景是用来在Spark St ...
 
随机推荐
- ES6-面向对象即类
			
简单介绍 在ES6面向对象基本上与java的类实现类似 1 class关键字,构造器和类分开了 1.1 ES5代码如下 <!DOCTYPE html> <html lang=&quo ...
 - VUE 子组件向父组件传值 , 并且触发父组件方法(函数)
			
目标:封装一个 搜索组件 <子组件需要传一个或者多个搜索参数到父组件,然后父组件执行列表查询函数> 1.子组件 <div> <input v-model="l ...
 - Rocket - debug - Periphery
			
https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...
 - 【SpringMVC】使用三层架构实现登录,注册。(上篇)
			
构思 界面层 1.jsp [见名知义] failed.jsp-->失败页面,登录.注册失败就跳转至失败页面 index.jsp-->默认生成的界面,没什么用 login.jsp--> ...
 - (Java实现) 洛谷 P1553 数字反转(升级版)
			
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
 - Java实现 删数字
			
删数字 时间限制: 1 Sec 内存限制: 128 MB 题目描述 奶牛在数学课上学习了整除的概念.农夫Farmer John为了考验它的数学水平,于是在白纸上写了正整数T.由于农夫不喜欢数字0,所以 ...
 - Java实现 LeetCode 646 最长数对链(暴力)
			
646. 最长数对链 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面. ...
 - Java实现 LeetCode 463 岛屿的周长
			
463. 岛屿的周长 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者 ...
 - Java实现 蓝桥杯VIP 基础练习 Huffuman树
			
基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...
 - java实现拼出漂亮的表格
			
/* * 在中文 Windows 环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来. 比如: ┌─┬─┐ │ │ │ ├─┼─┤ │ │ │ └─┴─┘ 其实,它是由如下的符号拼接的: 左上 = ...