首页 > 其他分享 >对一些常用RDD算子的总结

对一些常用RDD算子的总结

时间:2023-01-06 02:33:05浏览次数:68  
标签:总结 map word val RDD 算子 聚合

虽然目前逐渐sql化,但是掌握 RDD 常用算子是做好 Spark 应用开发的基础,而数据转换类算子则是基础中的基础,因此学习这些算子还是很有必要的。
这篇博客主要参考Spark官方文档中RDD编程一章,建议直接看官方写的文档进行学习,毕竟这是大佬们写的文章 https://spark.apache.org/docs/latest/rdd-programming-guide.html#overview

一、最常用的RDD算子

作为大数据领域的hello world, word count是入门级的程序,也是极其重要的基本功,下面给出scala版本的wc。

scala版本的wordCount
val config:SparkConf=new SparkConf().setMaster("local[*]").setAppName("test")
val sc = new SparkContext(config)
val data:RDD[String]=sc.textFile("your path")
val wordRDD:RDD[String]=data.flatMap(line=>line.split(" "))
val cleanWordRDD:RDD[String]=wordRDD.filter(word=>!word.equals(" "))
val kvWordRDD:RDD[(String,Int)]=cleanWordRDD.map(word=>(word,1))
val wordCounts:RDD[(String,Int)]=kvWordRDD.reduceByKey((x,y)=>(x+y))
wordCounts.collect()
上面使用了map,flatMap,filter,reduceByKey这四个transerformation算子和一个collect这个action算子(区别transerformation和action可以观察它的返回值,一般transerformation返回值还是RDD,action就是一个最终结果),这四个transerformation就是最常用的 RDD算子(我最常用)

首先是filter ,如果常用python做数据分析的同学注意一下,filter是筛选出结果而不是过滤掉不要的元素,也就是它有一个返回RDD而不是在原本RDD上过滤值,主要注意这点,filter里面可以是一个有名函数或者是一个匿名函数,但是最重要的是要返回一个boolean值

接下来重点介绍下map和flatMap以及mapPartition的区别,map算子是以元素为粒度进行数据转换,比如wc中wordRDD.map(word=>(word,1)),这就是对每一个word,转换为Pair形式,赋予一个权重,在工作过程中,如果遇到某一个element很重要,那么可以写程序对这个element赋予更多的权重,flatMap 的过程我的理解是,元素---->集合----->元素的一个过程,如下图所示

而最后的mapPartition 就是粗粒度的map,以数据分区为粒度,这个函数一般使用在有共同作用因子的场景,比如如对密码加盐,那么可以以数据分区为粒度实例化加密算子,然后使用map在对每个element作用了,这样做的好处就是高效利用内存

二、数据聚合算子

常见的有groupByKey,reduceByKey,aggregateByKey,这样算子一般用在聚合操作

groupByKey(),默认并发度是分区数量,不过也可以指定参数,这个算子的作用是数据收集,而不进行处理,仅仅是收集而非聚合,因此,这个算子在shuffle阶段会很耗性能,因为有大量数据走了shuffle

reduceByKey(f),聚合算子,顾名思义,按照key值分组聚合,reduceByKey算子依旧有shuffle阶段,但是它在map端也有进行聚合操作,所以,在工业环境中,这样会减少很多数据量,这也是该算子比groupByKey算子优秀的地方,不过该算子的缺点就是map端的reduce端的聚合操作必须一致,只能满足一些需求

aggregateByKey,它能使用两个聚合函数,分别作用在map端和reduce端,比如这样一个场景,先求和再求最大值,这样可以定义一个聚合函数F1为sum函数,第二个聚合函数为F2为max函数,其余的跟groupByKey类似

三、常见的ACTION算子

上面那些算子都是TRANSERFORMATION算子,而对数据收集成结果则需要使用ACTION算子,常见的action算子有collect,take,first,foreach,他们的算子使用很简单,不会的同学可以看下官网,不过这里要注意的是collect算子,它走的是全量收集,都收集到driver端,这样不仅会带来很大的网络开销同时driver端有可能发生OOM风险,对于这种情况,我可以查到的解决方法有使用saveAsTextFile来持久化到磁盘,避免与driver交互导致风险

四、持久化算子

spark的持久化以及持久化级别,我们另开文章进行总结。

标签:总结,map,word,val,RDD,算子,聚合
From: https://www.cnblogs.com/spark-cc/p/17029307.html

相关文章

  • cocos creator知识点总结
    1:比较常见的加载一个纹理  bundle.load('imgs/cocos',cc.SpriteFrame),为什么要加载个类型?从直接方面来说的话,没有类型的话,得到的是不唯一东西.举例,一个spine资源......
  • 代码随想录day9 LeetCode 459重复的子字符串 字符串总结
    459重复的子字符串https://leetcode.cn/problems/repeated-substring-pattern/classSolution{public:int*getNext(strings){//创建next[i]为最长相等前后缀长度的......
  • 关于爬虫中几个常用库的使用方法总结
    关于爬虫中几个常用库的使用方法总结学了半个多月的爬虫了,用这个案例总结一下各个爬虫库的用法。当然后面还有更重要和更好用的方法,再等后面学到,再做总结了。1.目标......
  • 大厂必考深度学习算法面试题总结
    目录目录一,滤波器与卷积核二,卷积层和池化输出大小计算三,深度学习框架的张量形状格式四,Pytorch、Keras的池化层函数理解五,Pytorch和Keras的卷积层函数理解六,sof......
  • “你帮我助”软件开发总结
    利用软件工程的指导思想开发软件比盲目的开发更有效率,结构更加清晰。1、首先是,在真正写代码前,要认真分析需求,最好是能够写出软件实际项目结构(越详细越好,有不合理的地方后......
  • 由char和byte的关系引申出去——总结一下java中的字符编码相关知识
    由char和byte的关系引申出去——总结一下java中的字符编码相关知识一、字符编码手持两把锟斤拷,口中直呼烫烫烫​   在文章伊始,先来复习一下计算机中关于编码的一些......
  • 失败总结
    亏钱的票:牧原股份新华制药(下跌趋势,抄底)三一重工中国电建(上涨趋势,加速上涨且放巨量,回落后没有及时止损)恒立液压(底部横盘双重底的第二重底,放巨量上涨过程中进场,在......
  • 看完了108份面试题,我为你总结出了这 10 个【Hive】高频考点(建议收藏)
    前言        之前听CSDN头牌博主@沉默王二说过一句话,我觉得十分在理:处在互联网时代,是一种幸福,因为各式各样的信息非常容易触达,如果掌握了信息筛选的能力,就真的......
  • as3与php交互实现总结
     目前flash在各方个面的应用越来越广,而flash也不单只是注重自身绚丽的效果,也需要和外界程序交换数据,以实现更强大的功能,随着as3的到来,flash和外部交互的方式也越来越简便......
  • 2022年终总结
    我一向是不喜欢写什么总结的,就像我小时候不喜欢写各种观后感(即便如此我小作文写的还是不错的)。但是今年我觉得应该写点什么了,经历了起落落落的状态,多少有些感慨需......