【博学谷学习记录】超强总结,用心分享 | spark知识点总结2
【博学谷IT技术支持】
Action动作算子
- reduce: 通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的
- collect: 在驱动程序中,以数组的形式返回数据集的所有元素
- count: 返回RDD的元素个数
- first: 返回RDD的第一个元素(类似于take(1))
- take: 返回一个由数据集的前n个元素组成的数据
- takeSample:返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否用随机数替换不足的部分,seed用于发送指定随机数生成器种子
- takeOrdered: 返回自然顺序或者自定义顺序的前n个元素
- saveAsTextFile:将数据集以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark会调用toString方法,将它转换为文件中的文本
- saveAsSequenceFile:将数据集中的元素以 Hadoop sequencefile 的格式保存到指定的目录下,可以使 HDFS 或者其他 Hadoop 支持的文件系统
- saveAsObjectFile: 将数据集的元素,以java序列号化的方式保存到指定的目录下
- countByKey:针对(K,V)类型的RDD,返回一个(K,Int)的map,表示每一个key对应的元素个数
- foreach:数据集的每一个元素上,运用函数func进行更新
- foreachPartition:在数据集的每一个分区上,运行函数func
统计操作
算子 | 含义 |
---|---|
count | 个数 |
mean | 均值 |
sum | 求和 |
max | 最大值 |
min | 最小值 |
variance | 方差 |
sampleVariance | 从采样中计算方差 |
stdev | 标准差:衡量数据的离散程度 |
sampleStdev | 采样的标准差 |
stats | 查看统计结果 |
RDD的持久化/缓存
RDD通过persist或cache方法可以将前面的计算结果缓存, 但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。cache 最终也是调用了 persist 无参方法(默认存储只存在内存中)
持久化级别 | 说明 |
---|---|
MORY_ONLY(默认) | 将 RDD 以非序列化的 Java 对象存储在 JVM 中。如果没有足够的内存存储 RDD,则某些分区将不会被缓存,每次需要时都会重新计算。这是默认级别 |
MORY_AND_DISK(开发中可以使用这个) | 将 RDD 以非序列化的 Java 对象存储在 JVM 中。如果数据在内存中放不下,则溢写到磁盘上.需要时则会从磁盘上读取 |
MEMORY_ONLY_SER (Java and Scala) | 将 RDD 以序列化的 Java 对象(每个分区一个字节数组)的方式存储.这通常比非序列化对象(deserialized objects)更具空间效率,特别是在使用快速序列化的情况下,但是这种方式读取数据会消耗更多的 CPU |
MEMORY_AND_DISK_SER (Java and Scala) | 与 MEMORY_ONLY_SER 类似,但如果数据在内存中放不下,则溢写到磁盘上,而不是每次需要重新计算它们 |
DISK_ONLY | 将 RDD 分区存储在磁盘上 |
MEMORY_ONLY_2, MEMORY_AND_DISK_2 等 | 与上面的储存级别相同,只不过将持久化数据存为两份,备份每个分区存储在两个集群节点上 |
OFF_HEAP(实验中) | 与 MEMORY_ONLY_SER 类似,但将数据存储在堆外内存中。(即不是直接存储在 JVM 内存中) |
- RDD持久化/缓存的目的是为了提高后续的操作的速度
- 缓存的级别由很多,默认值只存在内存中,开发中使用memory_and_disk
- 只有执行action操作的时候才会真正将RDD数据进行持久化/缓存
- 实际开发中如果某个RDD后续会被频繁使用,可以将该RDD进行持久化缓存