Spark-RDD常用算子

算子的分类

spark的rdd的算子可以分为两大类:Transformation算子和 Action算子,其中Transformation算子是惰性的,只有rdd触发 Action算子时,才会执行Transformation算子;并且每个Transformation算子都会生成一个Task,每个Action算子都会生成一个job。

Transformation算子

parallelize:将Scala的数值和集合创建成RDD。

makeRDD:将Scala的数值和集合创建成RDD。

partitions.length:查看RDD的分区数量。
filter:过滤RDD中满足条件的数据。

map:对RDD数据进行某种逻辑操作。

sortBy:对RDD的数据进行排序,"true"为升序,"false"为降序。

union:对两个RDD数据求并集。

intersection:对两个RDD数据求交集。

diff:对两个RDD数据求差集。
注:对RDD进行,并、交和差集时,两个RDD的数据类型必须一致。

distinct:对RDD数据进行去重。

join:对两个RDD数据进行join(连接)操作。

leftOuterJoin:对两个RDD数据进行左连接。

rightOuterJoin:对两个RDD数据进行右连接。
注:左、右连接操作时,使用"None"带替"null"

cogroup:对两个RDD数据进行协分布操作。
注:协分布是将两个RDD集合中数据为"null"的数据使用"CompactBuffer()"代替。

mapValues:将RDD数据(以"key-value"的形式存储)中Value值进行某种操作。

groupByKey:将RDD数据(以"key-value"的形式存储)中key值相同的value分配到一组中。

reduceByKey:将RDD数据(以"key-value"的形式存储)中key值相同的value先局部聚合,在全局聚合。

cartesian:将两个RDD进行笛卡尔积。

mapPartitionsWithIndex:一次拿出一个分区的数据,并且可以将分区的编号取出来。

//逻辑操作:
val func = (index: Int, iter: Iterator[Int]) => {
  iter.map(x => "[partID:" +  index + ", val: " + x + "]")
}

mapPartition:一次拿出一个分区的数据。

//逻辑操作:
var  func = (iter: Iterator[Int])=>{
      iter.map(x => s"val:$x")
    }

aggregateByKey:先将相同key的数据进行分组,然后在局部操作,最后再全局操作,可以指定初始值,指定的初始值会在每个分区都使用一次,但是在最后的全局操作时,初始值不进行操作。

aggregate:先局部操作,再全局操作,可以指定初始值,指定的初始值会在每个分区都使用一次,并且也会在最后的全局操作时,在使用一次。

filterByRange:过滤某个范围的数据,前后都是闭区间。

flatMapValues:对RDD中的value值进行flatMap操作。

foldByKey:同aggregateByKey。

combineByKey:该算子是一个底层的算子,他会向将key进行分组,他需要传递三个函数,第一个函数是将分好的key的第一个value取出来进行某种操作;第二个函数是在每个分区中,将value中的其他元素进行某种操作。第三个函数是将每个分区中的数据汇总后,相同的key进行某种操作。并且可以给他传递一个HashPartition来修改他的分区数量。

mapPartitions:对一个分区进行map操作,参数是一个迭代器,返回值也是一个迭代器。
partitionBy:将数据按照指定的分区器进行分区,参数是一个分区器。

cache:将RDD中的数据存储放到spark的内存中,他与其他的Transformation算子不同,他不会生成新的RDD,而是将调用他的RDD标记,当第一次触发Action算子时,会将该RDD放入到spark的内存中,之后再使用该RDD中的数据时,就直接在内存中读取,速度非常快;当要缓存到内存的数据太大时,调用该方法并且触发Action算子后,会将一部分数据存储到内存中(存储到Executor端)。一旦将数据存储在内存中后,必须使用方法来讲内存中的数据释放掉,或者将该RDD的应用终止。

unpersist(Boolean):将内存中的数据释放掉,"true"表示同步释放,"false"表示异步释放。

checkpint:将spark的中间数据存储到指定的目录中,用于切断RDD的血缘关系,确保RDD数据能够快速恢复。

setCheckpointDir:指定RDD中间数据存储的目录。

Action算子

collect:将RDD的结果以数组的形式返回。

reduce:返回RDD数据进行某种逻辑操作("+"、"-"等)后的结果。

top(n):返回RDD中最大的前n个数据(此算子会先将RDD进行降序排列)。

take(n):返回RDD中前n个数据。

first:返回RDD中第一个数据。

takeOrdered(n):返回RDD中最小的前n个数据(此算子会先将RDD进行升序排列)。

count:返回RDD中数据的个数。

collectAsMap:将RDD的结果以map的形式返还。

saveAsTextFile:将RDD的结果以Text格式存储到HDFS系统中。

countByKey:统计RDD中同一key出现的次数,与key的value值无关。

countByValue:统计RDD中相同数据出现的次数,即key值与value值都相同。

foreach:将RDD的数据一条一条输出到spark的worker节点管理的Executor中。

foreachPartition:将RDD的数据一个分区的数据输出到spark的worker节点管理的Executor中。

rdd.foreachPartition(x => x.foreach(y=>println(y*100)))

注:只要是算子中带有"By"的,他操作的RDD的数据类型都是以"key-value"的形式,并且他是分区器默认是"Hash-Partition"。

猜你喜欢

转载自blog.csdn.net/weixin_38613375/article/details/89180850