spark常用算子

action算子

会触发SparkContext提交Job作业,决定一个application中有多少个job

count:统计RDD共有多少行,并返回最终结果。

take(N):取出RDD的前N个元素

collect:回收算子,会将结果回收到Driver端,需要注意的是,数据量较大时,可能会在Driver端造成OOM。

foreach:遍历RDD中的每一个元素

saveAsTextFile:将DataSet中的元素以文本的形式写入本地或者HDFS系统中。

transaction算子

属于懒执行。

map:通过自定义的函数,映射转变为一个新的元素,作用域为RDD内所有元素。处理数据为一对一。

mapPartitions:通过函数获取到每个分区,并通过对分区内的所有元素进行操作。作用域为分区。相对于map,性能较高。

flatMap:通过自定义函数,可以将该RDD中一个集合中的元素打散,生成多个元素进行处理。处理数据为一对多。

filter:对元素经行过滤操作,对于满足函数要求的元素保留在RDD中,不满足的过滤掉。

sortBy:该函数实现依赖于sortByKey。相当于map+sortBykey

sortByKey:作用于<k, v>类型的RDD,并对k进行排序

reduceByKey:可以用于对RDD中的键值进行分组,会进行map端的聚合操作。对每个键的所有值进行归约操作,返回的是<k,reduce_v>类型的RDD。可以聚合每个分区相同键的键值对,减少了网络传输的数据量。

groupBy:按照指定规则,将数据分组。即相当于先进行了map操作,再根据key进行groupByKey操作

groupByKey:可以用于对RDD中的键值进行分组,但不会进行map端的聚合操作。其返回的是<k, Iterable<v>>类型的RDD,这种方式会导致在处理大量数据时,由于将相同的键的键值对放在同一分区,导致该分区的数据会很大,从而影响性能。

注:reduceByKey的性能比groupByKey高

join:会产生shuffle。按照相同的key生成新的RDD的分区数为大的RDD的分区数。类似于sql中的inner join

leftOuterJoin/rightOuterJoin/fullOuterJoin:类似于sql中的外连接。

union:类似于sql语句中的union all函数。需要保证两个RDD元素数据类型相同,不进行去重操作,保存所有元素。

distinct:将RDD中的元素进行去重操作。

cartesian:对两个RDD内的所有元素进行笛卡尔积操作。对于笛卡尔积操作后的数据量会呈爆炸性增长,容易导致OOM,所以尽量不要使用这类算子。

持久化算子

将数据放置在内存中(当内存不够用时,会溢出到磁盘中)。持久化操作的意义是避免了重复计算,提升框架的性能。

cache:将RDD的数据持久化到内存中。cache是懒执行,持久化的单位是partition。持久化的数据在application执行完成后会被清除。相当于persist(MEMORY_ONLY)函数功能

persist:可以指定持久化的级别。懒执行,持久化的单位是partition。持久化的数据在application执行完成后会被清除。数据会落地到磁盘,但是用户不可见。

        MEMORY_ONLY:将RDD以反序列化的Java对象的形式存储在JVM中,在内存不够时,部分数据不会被缓存,每次使用时需要重新计算,默认级别。

        MEMORY_AND_DISK:将RDD以反序列化的Java对象的形式存储在JVM中,在内存不够用时,将未缓存的数据分区存储在磁盘中。

        MEMORY_ONLY_2,MEMORY_AND_DISK_2,....:与上述级别相同,但是每个分区会在集群中两个节点创立副本。

       MEMORY_ONLY_SER:将RDD以序列化的Java对象的形式存储。这种方式比反序列化的方式节省空间。如果内存空间不够用时,部分数据不会被持久化,使用这部分数据需要重新计算。

        MEMORY_AND_DISK_SER:将RDD以序列化的Java对象的形式存储。如果内存空间不够用时,无法缓存的数据分区会被溢出到磁盘中,使用这部分数据需要从磁盘读取。

        DISK_ONLY:在磁盘上缓存。

        OFF_HEAP:将数据存储在off-heap memory中,使用的是堆外内存。可能会利用到更大的内存存储空间,但是可能会导致GC。

chechpoint:类似于快照。可以将RDD执行到磁盘中,还可以切断RDD之间的依赖关系。在RDD执行checkpoint之前,最好是先执行cache,这样启动新的job只需要将内存的数据拷贝到HDFS就可以,省略了重新计算。需要重新指定额外的目录存储数据,由外部的存储系统管理,不是由Spark框架管理,application执行完成后持久化的数据不会被清除。即数据落地到磁盘中,但需要指定外部目录。作用是:将DAG中比较重要的中间数据做一个检查点将结果存储到高可用的集群中。

注意:懒执行必须由一个action算子触发执行。

懒执行的操作意义: 避免了大量无意义的计算,及大量无意义计算的中间结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难得将就

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值