前言: 在开发并行程序时,可以利用类似 Fork/Join 的框架将一个大的任务切分成细小的任务,每个小任务模块之间是相互独立的,可以并行执行,然后将所有小任务的结果汇总起来,得到最终的结果。
hadoop的Map和Reduce操作操作就是利用了这一思想,通过 map 操作让不同的集群节点并行计算,之后通过 reduce 操作将结果整合起来得到最终输出。
Spark算子简介: 对于 Spark 处理的大量数据,先将数据切分放入RDD这一数据结构,我们开发就利用一些算子操作丶转换RDD操作调度集群资源进行计算.
1.RDD的分类
- RDD分为两大类(Transformation转换算子和Action动作算子(触发DAG的执行))
官方文档:http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations
2. Transformation转换算子操作详解
- RDD中的所有转换都是延迟加载的,也就是说,它们并不会直接计算结果(避免了多次与磁盘的逻辑交互,提高了效率).
- Transformation算子分为3类: 值类型丶双值类型丶Key-Value类型
2.1 值类型valueType
-
map(func) : 通过函数操作返回一个新的RDD
-
filter(func): 筛选出
-
flatMap(func): 类似于Map,一对一映射彼 扁平化
-
mapPartitions(func):
-
mapPartitionsWithIndex(func)
-
sample(withReplacement, fraction, seed):
-
Glom
-
sortBy(func,[ascending], [numTasks])
-
coalesce(numPartitions)
-
repartition(numPartitions)
2.2 双值类型DoubleValueType
-
union(otherDataset): 将两个集合合并
-
intersection(otherDataset): 两个集合的交集
-
distinct([numTasks])): 去重
-
Subtract
-
zip(otherDataset): 拉链操作代码,分区数要相同,不然报错.
2.3 Key-Value值类型
-
partitionBy
-
reduceByKey(func, [numTasks])
-
groupByKey: groupByKey也是对每个key进行操作,但只生成一个sequence。
-
reduceByKey和groupByKey的区别(面试问)
- reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v].
- groupByKey:按照key进行分组,直接进行shuffle。
- 开发指导:reduceByKey比groupByKey,建议使用。但是需要注意是否会影响业务逻辑。
-
combineByKey[C]: combineByKey是Spark中一个比较核心的高级且底层函数,其他一些高阶键值对函数底层都是用它实现的。诸如 groupByKey,reduceByKey等等
-
aggregateByKey(zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)
-
foldByKey(zeroValue: V)(func: (V, V) => V): RDD[(K, V)] : aggregateByKey的简化操作,seqop和combop相同
-
sortByKey([ascending], [numTasks]): 在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD
-
join(otherDataset, [numTasks])
-
cogroup(otherDataset, [numTasks]): 在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD
-
cartesian(otherDataset): 笛卡尔积
-
mapValues:针对于(K,V)形式的类型只对V进行操作
3. Action算子(触发DAG的执行)
-
reduce(func): 通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的
-
collect():
-
count(): 返回RDD的元素个数
-
first(): 返回RDD的第一个元素(类似于take(1))
-
take(n) : 返回一个由数据集的前n个元素组成的数组
-
takeSample(withReplacement,num, [seed]) : 返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否用随机数替换不足的部分,seed用于指定随机数生成器种子
-
takeOrdered(n): 返回前几个的排序
-
aggregate (zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
-
fold(num)(func) : 折叠操作,aggregate的简化操作,seqop和combop一样。
-
saveAsTextFile(path) :将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本
-
saveAsSequenceFile(path) : 将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以使HDFS或者其他Hadoop支持的文件系统。
-
saveAsObjectFile(path) : 用于将RDD中的元素序列化成对象,存储到文件中。
-
countByKey(): 针对(K,V)类型的RDD,返回一个(K,Int)的map,
表示每一个key对应的元素个数。
-
foreach(func):在数据集的每一个元素上,运行函数func进行更新。
3.1 数值RDD统计操作
简介: Spark 的数值操作是通过流式算法实现的,允许以每次一个元素的方式构建出模型。这些统计数据都会在调用 stats() 时通过一次遍历数据计算出来,并以 StatsCounter 对象返回。