【菜鸟系列】spark常用算子总结(scala、java)--groupByKey,reduceByKey

Spark算子reduceByKey深度解析 最近经常使用到reduceByKey这个算子,懵逼的时间占据多数,所以沉下心来翻墙上国外的帖子仔细过了一遍,发现一篇不错的,在此加上个人的理解整体过一遍这个算子,那么我们开始: 国外的大牛一上来给出这么一句话,个人感觉高度概括了reduceByKey的功能:Spark RDD reduceByKey function merges the values for each key using 阅读详情

groupByKey和reduceByKey是常用的聚合函数,作用的数据集为PairRDD

scala
reduceByKey函数原型

def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)] = self.withScope {
combineByKeyWithClassTag[V]((v: V) => v, func, func, partitioner)
}

我们可以发现,输入参数是两个,第一个参数是分区函数,第二个是作用在value上的一个函数,如果第一个参数为空,则使用默认的hashPartitioner;

reduceByKey样例

  val conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local")
  val sc = new SparkContext(conf)
  val data = sc.makeRDD(List("pandas","numpy","pip","pip","pip"))
  //mapToPair
  val dataPair = data.map((_,1))

  //reduceByKey
  val result1 = dataPair.reduceByKey(_+_)
  //或者
  // val result2 = dataPair.reduceByKey((x,y)=>(x+y))

groupByKey函数原型

def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])] = self.withScope {
// groupByKey shouldn’t use map side combine because map side combine does not
// reduce the amount of data shuffled and requires all map side data be inserted
// into a hash table, leading to more objects in the old gen.
val createCombiner = (v: V) => CompactBuffer(v)
val mergeValue = (buf: CompactBuffer[V], v: V) => buf += v
val mergeCombiners = (c1: CompactBuffer[V], c2: CompactBuffer[V]) => c1 ++= c2
val bufs = combineByKeyWithClassTag[CompactBuffer[V]](
createCombiner, mergeValue, mergeCombiners, partitioner, mapSideCombine = false)
bufs.asInstanceOf[RDD[(K, Iterable[V])]]
}

我们发现groupByKey输入参数为分区方式,参数为空,代表采用默认的hashPartitioner,返回值为RDD[(K, Iterable[V])

其实reduceByKey与groupByKey底层调用的都是combineByKeyWithClassTag,我们都知道,reduceByKey是分区内先进行一个合并,在进行shuffle混洗;而groupByKey是直接进行shuffle混洗,效率上来看,一定是reduceByKey更优,下面我们看下combineByKeyWithClassTag,会发现,有个参数叫mapSideCombine,这个参数是控制在shuffle前是否进行分区内聚合操作,reduceByKey默认是true

def combineByKeyWithClassTag[C](
createCombiner: V => C,
mergeValue: (C, V) => C,
mergeCombiners: (C, C) => C,
partitioner: Partitioner,
mapSideCombine: Boolean = true,
serializer: Serializer = null)(implicit ct: ClassTag[C]): RDD[(K, C)] = self.withScope {
require(mergeCombiners != null, “mergeCombiners must be defined”) // required as of Spark 0.9.0
if (keyClass.isArray) {
if (mapSideCombine) {
throw new SparkException(“Cannot use map-side combining with array keys.”)
}
if (partitioner.isInstanceOf[HashPartitioner]) {
throw new SparkException(“Default partitioner cannot partition array keys.”)
}
}
val aggregator = new Aggregator[K, V, C](
self.context.clean(createCombiner),
self.context.clean(mergeValue),
self.context.clean(mergeCombiners))
if (self.partitioner == Some(partitioner)) {
self.mapPartitions(iter => {
val context = TaskContext.get()
new InterruptibleIterator(context, aggregator.combineValuesByKey(iter, context))
}, preservesPartitioning = true)
} else {
new ShuffledRDD[K, V, C](self, partitioner)
.setSerializer(serializer)
.setAggregator(aggregator)
.setMapSideCombine(mapSideCombine)
}
}

groupByKey样例

  val conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local")
  val sc = new SparkContext(conf)
  val data = sc.makeRDD(List("pandas","numpy","pip","pip","pip"))
  //mapToPair
  val dataPair = data.map((_,1))
  //groupByKey
  val result3 = dataPair.groupByKey()
  //此时返回的是RDD:String,Iterable<Integer>,下面的代码对  x._2进行一个累加
  val result4 = result3.map(x=>(x._1,x._2.sum))

================================================================
java
reduceByKey样例

SparkConf conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        //并行集合生成JavaRDD
        JavaRDD lines = jsc.parallelize(Arrays.asList("pandas","numpy","pip","pip","pip"));
JavaPairRDD<String,Integer> mapToPairResult = lines.mapToPair(new PairFunction<String,String,Integer>() {
            @Override
            public Tuple2<String,Integer> call(String o) throws Exception {
                Tuple2 tuple2 = new Tuple2(o,1);
                //System.out.println(tuple2._1()+":"+tuple2._2());
                return tuple2;
            }
        });
        //reduceByKey 统计词频
        JavaPairRDD reduceByKeyResult = mapToPairResult.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer i1, Integer i2) throws Exception {
                return i1+i2;
            }
        });

groupByKey样例

SparkConf conf = new SparkConf().setAppName("jiangtao_demo").setMaster("local");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        //并行集合生成JavaRDD
        JavaRDD lines = jsc.parallelize(Arrays.asList("pandas","numpy","pip","pip","pip"));
JavaPairRDD<String,Integer> mapToPairResult = lines.mapToPair(new PairFunction<String,String,Integer>() {
            @Override
            public Tuple2<String,Integer> call(String o) throws Exception {
                Tuple2 tuple2 = new Tuple2(o,1);
                //System.out.println(tuple2._1()+":"+tuple2._2());
                return tuple2;
            }
        });
        //groupByKey 统计词频
        JavaPairRDD groupByKeyResult = mapToPairResult.groupByKey();
        //此时返回的结果是JavaPairRDD<String,Iterable>
        //[(pip,[1, 1, 1]), (pandas,[1]), (numpy,[1])]
        System.out.println(groupByKeyResult.collect());
        JavaPairRDD<String,Integer> gr = groupByKeyResult.mapToPair(new PairFunction<Tuple2<String,Iterable>,String,Integer>(){

            public Tuple2<String,Integer> call(Tuple2<String,Iterable> tuple2){
                int sum = 0;
                Iterator<Integer> it = tuple2._2.iterator();
                while(it.hasNext()){
                    sum += it.next();
                }
                return new Tuple2<String,Integer>(tuple2._1,sum);
            }
        });
        System.out.println(gr.collect());
        //返回结果[(pip,3), (pandas,1), (numpy,1)]

后续会补全更多的常用算子,敬请关注,此文原创,转载请注明出处

(二)常用Shuffle类算子:groupByKey、reduceByKey、aggregateByKey 和 sortByKey 在数据分析场景中,典型的计算类型分别是分组、聚合和排序。而 groupByKey、reduceByKey、aggregateByKey 和 sortByKey 这些算子的功能,恰恰就是用来实现分组、聚合和排序的计算逻辑。 这些算子看上去相比其他算子的适用范围更窄,也就是它们只能作用(Apply)在 Paired RDD 之上,所谓 Paired RDD,它指的是元素类型为(Key,Value)键值对的 RDD。 但是在功能方面,可以说,它们承担了数据分析场景中的大... 阅读详情

相关推荐

STM32超声波避障小车硬件设计与实时测距实现

超声波测距是嵌入式系统中经典的环境感知技术,其原理基于声波在空气中的传播时间与距离的线性关系,通过精确计时实现非接触式距离测量。该技术具备成本低、抗光干扰强、算法简洁等优势,广泛应用于智能小车、机器人避障、液位监测等场景。工程落地的关键在于硬件信号完整性(如5V/3.3V电平匹配)、微秒级定时精度(依赖高稳定外部晶振与输入捕获模式)以及强干扰环境下的数据鲁棒性(需软硬协同滤波)。本文以STM32F103C8T6为平台,深入解析HC-SR04模块的时序闭环控制、TIM3输入捕获双沿测量、L298N电机状态机驱

weixin_42578963的博客 298

Scala reduceByKey()函数详解

该函数的作用是对两个RDD结构数据进行压缩合并,将有相同key的数据合并在一起,只保留一个key对应一条数据,从而起到压缩数据的效果,对同一key下的value进行合并的方式可以指定一个计算逻辑C。 函数可以表示为: 原RDD数据.((x,y)=>表达式c)。 接下来据两个例子: 语句: val c = sc.parallelize(1 to 10) c.reduce((x, y) => x + y) 输出:55 解析:元组c展开为(1,2,3,4,5,6,7,8,9),转换成

马飞飞的博客 8180

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决)

本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。

weixin_28366475的博客 272

Spark Scala当中reduceByKey的用法

/*reduceByKey(function) reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行function的reduce操作(如前所述),因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。 reduceByKey(_+_)是reduceByKey((x,y) => x+y)的一个 简洁的形式 */ ...

mark_to_win的专栏 2574

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 290

GEE去云处理代码段解读(位运算)

GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读

jiekeheiguanglan的博客 2069

scala 手动实现reduceByKey

def sortedTopOne(data: String): String = { /**** * @param data 50条数据 * 实现50条数据取每一项数据中最重要的一条数据 */ var x = List() val map:mutable.HashMap[String,Integer] = new mutable.HashMap[Strin...

enjoy 1097

vLLM 多机多卡推理测试与验证(Kubernetes)vLLM 多机多卡推理 Kubernetes 验证

本文记录在两台 L20 机器,每台机器 4 块 L20 显卡(46G)的环境下,使用 vLLM 部署 Qwen2.5-32B-Instruct-GPTQ-Int4 模型并提供多节点多卡推理服务的过程。服务(Serving)模型服务是指将模型部署到生产环境中,通过 API 或其他接口提供预测服务的过程。【分布式推理与服务】(Distributed Inference and Serving)是指在多个机器或设备之间部署和管理机器学习模型,以高效地处理推理请求并满足大规模服务需求。3、启动 vLLM 服务。

流水_鱼鱼的博客 3459

Spark RDD的groupBy算子和groupBykey算子的对比

groupBy可以基于任意的分组逻辑进行分组,适用于更广泛的场景。返回的是,可以应用于任何RDD。性能上较为灵活,适合不同类型的数据。groupByKey只能用于PairRDD(键值对RDD),且只能基于键来分组。在处理大规模数据时,如果每个键的值非常多,可能会导致性能瓶颈。推荐用于键值对已经按键进行分组的情况,不需要额外的分组逻辑。在Spark中,groupBy和groupByKey都是用于分组数据的算子,但它们的行为和适用场景有所不同,特别是在性能上。

z1941563559的博客 1670

基于NAS的OpenClaw部署方案:家庭服务器架构设计

本文提出了一种基于NAS的家庭服务器架构方案,用于部署OpenClaw AI系统。文章分析了NAS作为部署平台的六大优势:集中化数据管理、大容量存储、多用户并发访问、7×24小时稳定运行、低功耗设计以及丰富的扩展能力。针对不同用户需求,详细对比了主流NAS型号(如Synology DS923+、QNAP TS-870等)和DIY方案的硬件配置,并给出了最低/推荐配置标准。在部署方案部分,重点介绍了Synology DSM和TrueNAS两种系统的初始化步骤,以及通过Docker容器安装Python、Redi

博客 2509

【CANoe】CAPL_UDS安全算法dll制作

使用UDS进行刷写时,需要27服务解密后,才能正确执行刷写,本文提供两种制作27解密dll的方法,用于CANoe的CAPL脚本中。

星Yeah 的博客 1万+

Spark Scala WordCount

spark scala版词频统计

梦想小镇 601

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

用Apache Spark进行大数据处理——第一部分:入门介绍

转自:http://www.infoq.com/cn/articles/apache-spark-introduction 什么是Spark Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。 与Hadoop和Storm等其他大数据和MapRe

tyb1222的专栏 2257

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spark中groupByKey() 和 reduceByKey() 和combineByKey()

在一个(K,V)的RDD上调用,返回一个(K, Iterator[V])的RDD,也是对每个key进行操作,但只生成一个sequence,groupByKey本身不能自定义函数,需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作。 是对key的value进行merge操作,在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的

大数据 3334

Spark中常用的聚合算子说明及使用

spark常用聚合算子groupByKey、reduceByKey、aggregateByKey、foldByKey、combineByKey的基本使用及区别

星空的风fly 2940

Scala学习(二)groupByKey和reduceByKey

大数据处理中有一个典型的例子WordCount,类似与Hello World的作用,map阶段主要是将单词转换为(word,1)的形式,在reduce阶段则是将Key值相同的1累加求和,最终得到的结果就是单词的count数。假设map的结果为(word,(m,n))如果按照key值将对应的列累加起来呢?比如经过map的数据集是这样的("happy",1,3),("hello",2,6),("hap...

哆啦咪~fo 1万+

Spark

1.Spark架构设计 1.1架构设计图 1.2 相关术语名词解释 1、RDD(Resillient Distributed DataSet) 弹性分布式数据集,是对数据集在Spark存储和计算过程中的一种抽象 是一组制度,可分区的分布式数据集和 一个RDD包含多个分区Partition(相当于MapReduce中的INputSplit),分区是依照一定的规则的,将具有相同规则的属性的数据记录放在一起 横向上课切分并行计算,以分区Partition为切分后的最小存储和计算单元。 纵向上可

weixin_46579297的博客 1847

Spark Scala当中reduceByKey(_+_) reduceByKey((x,y) => x+y)的用法

马克-to-win@ 马克java社区:reduceByKey(_+_)是reduceByKey((x,y) => x+y)的一个 简洁的形式 */ val rdd08 = sc.parallelize(List((1, 1), (1, 4),(1, 3), (3, 7), (3, 5))) val rdd08_1 = rdd08.reduceByKey((x, y) =...

mark_to_win的专栏 2326

reduceByKey groupByKey countByKey使用及区别总结

三者都是对(k,v)类型的RDD进行聚合操作,但是具体的聚合方式和使用场景不同 1.reduceByKey 在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,reduce任务的个数可以通过第二个可选的参数来设置。在shuffle之前,会在分区内部进行预聚合操作,降低开销。 需求:创建一个pairRDD,计算相同key对应值的相加结果 (1)创建一个pairRDD scala> val rdd = sc.parallelize(Lis

kk阿彬 1581

spark rdd之groupByKey

GroupByKey操作可能非常昂贵。如果您正在分组以便对每个键执行聚合(例如求和或平均),则使用 `aggregateByKey` 或` reduceByKey` 将提供更好的性能。 >注意:按照目前的实现,groupByKey 必须能够保存内存中任何键的所有键值对。如果一个键的值太多,造成数据倾斜,可能会导致 `OutOfMemoryError`

南风知我意 1346

elasticsearch-各种查询

本文查询基于es6.4.3版本,其他版本可能会有差异,有就再说吧… 文章目录基本语法返回值说明term查询:terms查询:match_all查询:match : 分词匹配查询布尔match : 分词匹配查询 基本语法 GET /索引/_search { "query":{ "查询类型":{ "查询条件":"查询条件值" } } } 这里的query代表一个查询对象,里面可以有不同的查询属性; 属性有: - term : 精准查询 - t

weixin_41395435的博客 2282

reducebykey怎么使用

reduceByKey是Spark中的一个用于聚合的函数。它的用法类似于RDD的groupByKey函数,但是它更加高效,因为它在聚合的过程中进行了局部聚合。 具体来说,reduceByKey函数用于将RDD[(K, V)]中的所有元素,按照Key进行分组,然后对每一组的所有元素进行聚合,最终将聚合后的结果返回为一个新的RDD[(K, V)]。 例如,假设有一个RDD[(Int, Int)],其中...

weixin_35756892的博客 1704

Spark调优之reduceByKey、groupByKey比较

目录 一:功能描述 二:事例分析 三:原因分析 四:图例比较 五:源码例证 六:结论 一:功能描述 reduceByKey:对每个key对应的value进行reduce操作 gropuByKey:根据key进行分组,每个key对应一个Iterable<value> 二:事例分析 wordCount.scala 中的单个词汇记数操作: val count...

威少(微笑) 1299

spark常用RDD算子 - groupByKey

def groupByKey(): RDD[(K, Iterable[V])] def groupByKey(numPartitions: Int): RDD[(K, Iterable[V])] def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])] groupByKey会将RDD[key,value] 按照相同的key进行分组,形成RDD[key,Iterable[value]]的形式, 有点类似于sql中的groupby,例如类

小哇 1911

reduceByKey 函数详解

reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数:keySelector:这是一个映射函数,用于从输入元素中提取键。valueReducer:这是另一个函数,用于将具有相同键的值集合合并成一个新的值。在 Spark 或类似框架中运行时,首先会对数据集进行分组(即按 key 分类),然后对每个 key 对应的所有 value 应用 valueReducer 函数求和、平均数等聚合操作。

xixixixixixixi21的博客 964
上一篇: sparkStreaming连接kafka(Direct)
下一篇: 【菜鸟系列】spark常用算子总结(scala、java)--map,flatMap,flatMapToPair
Java_Soldier
博客等级 码龄10年 27粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值