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 环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来. 比如: ┌─┬─┐ │ │ │ ├─┼─┤ │ │ │ └─┴─┘ 其实,它是由如下的符号拼接的: 左上 = ...