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 ...
随机推荐
- 本地安装JDK1.7和1.8,可相互快速切换
1.JDK官网下载jdk1.7和jdk1.8 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 2.将jdk1.7 ...
- Java实现 LeetCode 771 宝石与石头(这是真暴力)
771. 宝石与石头 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 ...
- Java实现 蓝桥杯 算法提高 抽卡游戏
试题 算法提高 抽卡游戏 某个抽卡游戏卡池抽出限定卡的概率为p,该游戏有一个"井"的机制,抽满k次卡后直接送这张限定卡.试求获得这张限定卡需要的期望抽卡次数.输入为一行,用空格隔开 ...
- PAT A除以B
本题要求计算A/B,其中A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数Q 和余数R,使得 A=B*Q+R 成立. 输入格式: 输入在一行中依次给出A 和B,中间以 1 空格分 ...
- Mybatis连接池及事务
一:Mybatis连接池 我们在学习WEB技术的时候肯定接触过许多连接池,比如C3P0.dbcp.druid,但是我们今天说的mybatis中也有连接池技术,可是它采用的是自己内部实现了一个连接池技术 ...
- 容器技术之Dockerfile(三)
前面我们聊到了dockerfile的 FROM.COPY .ADD.LABAL.MAINTAINER.ENV.ARG.WORKDIR.VOLUME.EXPOSE.RUN.CMD.ENTRYPOINT指 ...
- 用云开发Cloudbase,实现小程序多图片内容安全监测
前言 相比于文本的安全检测,图片的安全检测要稍微略复杂一些,当您读完本篇,将get到 图片安全检测的应用场景 解决图片的安全校验的方式 使用云调用方式对图片进行检测 如何对上传图片大小进行限制 如何解 ...
- ELK扫盲及搭建
1. ELK部署说明 1.1ELK介绍: 1.1.1 ELK是什么? ELK是三个开源软件的缩写,分别表示:ElasticSearch , Logstash, Kibana , 它们都是开源软件,EL ...
- Centos7 安装 redis6 的部分问题总结
首先把redis.tar.gz 解压到你想要的路径 检查一下安装环境: yum -y install gcc yum -y install epel-release 执行 make 和 make in ...
- Jmeter使用beanshell对数据进行加密传输
首先,来看一下接口签名加密规则 1.需要参于签名的参数: a. 在请求参数列表中,除去 cliSign 参数外,其他需要使用到的参数皆是要签名的参数. 2.生成签名字符串 a. 没有值的参数无需传递, ...