一、持久化
多次计算时,可能会重复利用一个数值,每次需要从头到尾的计算得出这个数值较为麻烦,所以可以将此RDD持久化,直接使用
二、实例
在此代码中,第一次执行计算是rdd.count()函数,当执行到rdd.collect()时,会重复执行之前的代码,rdd会被重复生成并计算
三、持久化方式
可以使用persist()方法将一个RDD持久化,但是只是标记为持久化,只有当第一个行动操作执行后才会被真正持久化
持久化级别 | 说明 |
MEMORY_ONLY |
使用未序列化的Java对象格式,将数据保存在内存中。如果内存不够存放所有的数据,则数据可能就不会进行持久化。那么下次对这个RDD执行算子操作时,那些没有被持久化的数据,需要从源头处重新计算一遍。 |
MEMORY_AND_DISK | 使用未序列化的Java对象格式,优先尝试将数据保存在内存中。如果内存不够存放所有的数据,会将数据写入磁盘文件中,下次对这个RDD执行算子时,持久化在磁盘文件中的数据会被读取出来使用。 |
MEMORY_ONLY_SER | 基本含义同MEMORY_ONLY。唯一的区别是,会将RDD中的数据进行序列化,RDD的每个partition会被序列化成一个字节数组。这种方式更加节省内存,从而可以避免持久化的数据占用过多内存导致频繁GC。 |
MEMORY_AND_DISK_SER | 基本含义同MEMORY_AND_DISK。唯一的区别是,会将RDD中的数据进行序列化,RDD的每个partition会被序列化成一个字节数组。这种方式更加节省内存,从而可以避免持久化的数据占用过多内存导致频繁GC。 |
DISK_ONLY | 使用未序列化的Java对象格式,将数据全部写入磁盘文件中。 |
四、学习视频
https://www.bilibili.com/video/BV1oE411s7h7?p=26