虽然目前逐渐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()
首先是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