1. 算子分类
Spark算子大体上分为两大类
- Transformation:操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发;
- Action:会触发 Spark 提交作业(Job),并将数据输出 Spark系统。
当然,对于transformation算子,如果要较真的话,还可以继续分一分
- Value数据类型的Transformation算子;
- Key-Value数据类型的Transfromation算子。
1.1 Value数据类型的Transformation算子
类型 | 算子 |
---|---|
输入分区与输出分区一对一型 | map、flatMap、mapPartitions、glom |
输入分区与输出分区多对一型 | union、cartesian |
输入分区与输出分区多对多型 | groupBy |
输出分区为输入分区子集型 | filter、distinct、subtract、sample、takeSample |
Cache型 | cache、persist |
1.2 Key-Value数据类型的Transfromation算子
类型 | 算子 |
---|---|
输入分区与输出分区一对一 | mapValues |
对单个RDD | combineByKey、reduceByKey、partitionBy |
两个RDD聚集 | Cogroup |
连接 | join、leftOutJoin、rightOutJoin |
1.3 Action算子
类型 | 算子 |
---|---|
无输出 | foreach |
HDFS | saveAsTextFile、saveAsObjectFile |
Scala集合和数据类型 | collect、collectAsMap、reduceByKeyLocally、lookup、count、top、reduce、fold、aggregate |
说明:
将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的元素
Scala示例:
2.2 filter说明:
对元素进行过滤,对每个元素应用f函数,返回值为true的元素在RDD中保留,返回为false的将过滤掉
Scala示例:
说明:
与map类似,但每个输入的RDD成员可以产生0或多个输出成员
Scala示例:
2.4 mapPartitions
说明:
与map类似,但map中的func作用的是RDD中的每个元素,而mapPartitions中的func作用的对象是RDD的一整个分区,所以func的类型是Iterator
Scala示例:
2.5 mapPartitionsWithIndex
说明:
与mapPartitions类似,但输入会多提供一个整数表示分区的编号,所以func的类型是(Int, Iterator)
Scala示例:
2.6 sample
说明:
对RDD进行抽样,其中参数withReplacement为true时表示抽样之后还放回,可以被多次抽样,false表示不放回;fraction表示抽样比例;seed为随机数种子,比如当前时间戳
Scala示例:
2.7 union
说明:
合并两个RDD,不去重,要求两个RDD中的元素类型一致
Scala示例:
2.8 intersection
说明:
返回两个RDD的交集
Scala示例:
2.9 distinct
说明:
对原RDD进行去重操作,返回RDD中没有重复的成员
Scala示例:
2.10 groupByKey
说明:
对
<key, value>
结构的RDD进行类似RMDB的group by聚合操作,具有相同key的RDD成员的value会被聚合在一起,返回的RDD的结构是(key, Iterator<value>)
Scala示例:
2.11 reduceByKey
说明:
对
<key, value>
结构的RDD进行聚合,对具有相同key的value调用func来进行reduce操作,func的类型必须是(V, V) => V
Scala示例:
2.12 aggregateByKey
说明:
aggregateByKey函数对PairRDD中相同Key的值进行聚合操作,在聚合过程中同样使用了一个中立的初始值。和aggregate函数类似,aggregateByKey返回值得类型不需要和RDD中value的类型一致。因为aggregateByKey是对相同Key中的值进行聚合操作,所以aggregateByKey函数最终返回的类型还是Pair RDD,对应的结果是Key和聚合好的值;而aggregate函数直接返回非RDD的结果。
参数:
- zeroValue:表示在每个分区中第一次拿到key值时,用于创建一个返回类型的函数,这个函数最终会被包装成先生成一个返回类型,然后通过调用seqOp函数,把第一个key对应的value添加到这个类型U的变量中。
- seqOp:这个用于把迭代分区中key对应的值添加到zeroValue创建的U类型实例中。
- combOp:这个用于合并每个分区中聚合过来的两个U类型的值。
Scala示例:
2.13 sortByKey
说明:
对
<key, value>
结构的RDD进行升序或降序排列
参数:
- comp:排序时的比较运算方式。
- ascending:false降序;true升序。
Scala示例:
2.14 join
说明:
对
<K, V>
和<K, W>
进行join操作,返回(K, (V, W))
外连接函数为leftOuterJoin、rightOuterJoin和fullOuterJoin
Scala示例:
2.15 cogroup
说明:
cogroup:对多个RDD中的KV元素,每个RDD中相同key中的元素分别聚合成一个集合,与reduceByKey不同的是针对两个RDD中相同的key的元素进行合并。
Scala示例:
2.16 cartesian
说明:
两个RDD进行笛卡尔积合并
Scala示例:
2.17 pipe
说明:
执行cmd命令,创建RDD
Scala示例:
echo.sh内容
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
测试代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
结果
2.18 coalesce
说明:
用于将RDD进行重分区,使用HashPartitioner,且该RDD的分区个数等于numPartitions个数,如果shuffle设置为true,则会进行shuffle。
Scala示例:
2.19 repartition
说明:
该函数其实就是coalesce函数第二个参数为true的实现
2.20 repartitionAndSortWithinPartitions
说明:
根据给定的Partitioner重新分区,并且每个分区内根据comp实现排序。
Scala示例
3. Action
3.1 reduce
说明:
对RDD成员使用func进行reduce操作,func接受两个参数,合并之后只返回一个值。reduce操作的返回结果只有一个值。需要注意的是,func会并发执行
Scala示例:
3.2 collect
说明:
将RDD读取至Driver程序,类型是Array,一般要求RDD不要太大。
3.3 count
说明:
返回RDD的成员数量
Scala示例:
3.4 first
说明:
返回RDD的第一个成员,等价于take(1)
Scala示例:
3.5 take
说明:
返回RDD前n个成员
Scala示例:
3.6 takeSample
说明:
和sample用法相同,只不第二个参数换成了个数。返回也不是RDD,而是collect。
Scala示例:
3.7 takeOrdered
说明:
用于从RDD中,按照默认(升序)或指定排序规则,返回前num个元素。
Scala示例:
3.8 saveAsTextFile
说明:
将RDD转换为文本内容并保存至路径path下,可能有多个文件(和partition数有关)。路径path可以是本地路径或HDFS地址,转换方法是对RDD成员调用toString函数
Scala示例:
3.9 saveAsSequenceFile
说明:
与saveAsTextFile类似,但以SequenceFile格式保存,成员类型必须实现Writeable接口或可以被隐式转换为Writable类型(比如基本Scala类型Int、String等)
3.10 saveAsObjectFile
说明:
用于将RDD中的元素序列化成对象,存储到文件中。对于HDFS,默认采用SequenceFile保存。
3.11 countByKey
说明:
仅适用于(K, V)类型,对key计数,返回(K, Int)
Scala示例:
3.12 foreach
说明:
对RDD中的每个成员执行func,没有返回值,常用于更新计数器或输出数据至外部存储系统。这里需要注意变量的作用域