1.cache()
使用默认的缓存级别MEMORY_ONLY将数据进行持久化
持久化级别由如下的取值:
可以调用rdd上的getStorageLevel获取当前rdd对应的持久化级别
from pyspark import *
import numpy as np
rdd = sc.parallelize(np.arange(10),3)
rdd.getStorageLevel()
rdd.cache()
rdd.getStorageLevel()
2.persist(storageLevel=StorageLevel(False, True, False, False, 1))
这个方法可以使用关键字参数 storageLevel指定缓存级别。默认的缓存级别是MEMORY_ONY,设置之后可以调用rdd上的is_cached 属性确认是否已经将RDD数据持久化。持久化选项如"1"中所示。
unpersist()和persist相反,该方法取消RDD的持久化,并从memoryManager中删除对应的持久化的 block信息。
3.cartesian(other)
当前rdd和"other"rdd原始的笛卡尔积,返回的是两个RDD元素两两组合的二元tuple
4.checkpoint()
设置检查点,该操作将切断该RDD的所有父依赖。调用该方法之前,首先要调用 SparkContext.setCheckpointDir()这个方法设置检查点的存储在HDFS上的位置,强烈建议将该RDD的 缓存级别设置为内存级别,否则的话由于依赖链断裂,如果再次使用到该RDD的话,将会从磁盘中的检 查点目录中再次读取数据,会耗费IO及CPU资源。在一些重要的计算节点设置checkpoint是一个好的习 惯,这样可以有效的进行异常错误的快速恢复。
sc.setCheckpointDir('/datas/checkpoint/')
rdd1 = sc.parallelize(range(10),3)
rdd2 = sc.parallelize(range(10),2)
rdd3 = rdd1.cartesian(rdd2)
rdd3.checkpoint()
这里注意:上面代码应该在checkpoint()之前先进行缓存
5.coalesce(numPartitions, shuffle=False)
调用该方法对RDD进行重分区,分区数会影响作业的并行 度,因此会视作业的具体情况设置合理的并行度。这个方法有一个关键字参数shuffle,默认为False,因 他的重分区行为不会涉及到shuffle操作,效率较高,若设置为True,效果和repartition方法类似,效率较低。
repartition(numPartitions):该方法也是用于对RDD进行重分区,其内部使用的是Shuffle重新分区数 据,如果说你要减少RDD中分区的数量,推荐使用coalesce方法
partitionBy(numPartitions, partitionFunc=portable_hash):使用给定分分区方法将RDD分 为numPartitions个。partitionFunc为可选参数,若未指定,其效果同repartition,默认使用基于shuffle的 机制重新分区数据。
案例:
rdd = sc.parallelize(range(10),6)
pairs = rdd.map(lambda x:(x,x**2+1))
print(pairs.getNumPartitions())
print(pairs.glom().collect())
print(pairs.partitionBy(2).getNumPartitions())
print(pairs.partitionBy(2).glom().collect())
print(pairs.partitionBy(2,partitionFunc=lambda x:x%5==0).getNumPartitions())
print(pairs.partitionBy(2,p