Spark-算子
简介
RDD 算子主要分为两类,一类为转换(transform)算子,一类为行动(action)算子,转换算子主要负责改变 RDD 中数据、切分 RDD 中数据、过滤掉某些数据等,并按照一定顺序组合。Spark 会将转换算子放入一个计算的有向无环图中,并不立刻执行,当 Driver 请求某些数据时,才会真正提交作业并触发计算,而行动算子就会触发 Driver 请求数据。这样设计的原因首先是避免无谓的计算开销,更重要的是 Spark 可以了解所有执行的算子,从而设定并优化执行计划。
官方地址:http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations
转换算子(Transformations)
Transformation | Meaning |
---|---|
map(func) | 通过函数func传递源的每个元素,返回一个新的分布式数据集。 |
filter(func) | 过滤数据,通过选择func返回true的源元素返回一个新的数据集。 |
flatMap(func) | 与map类似,但是每个输入项都可以映射到0个或更多的输出项(因此func应该返回一个Seq而不是单个项)。展平 多个集合 汇总成一个集合 |
mapPartitions(func) | 与map类似,但在RDD的每个分区(块)上分别运行,因此在类型为T的RDD上运行时,func必须是Iterator => Iterator |
mapPartitionsWithIndex(func) | 与mapPartitions类似,但也为func提供了一个表示分区索引的整数值,因此func必须是类型(Int, Iterator) => Iterator时,类型为T的RDD。 |
sample(withReplacement, fraction, seed) | 使用给定的随机数生成器种子,对数据的一小部分进行抽样,无论是否进行替换。 |
union(otherDataset) | 合并,返回一个新数据集,其中包含源数据集中的元素和参数的并集。 |
intersection(otherDataset) | 交集,返回一个新的RDD,其中包含源数据集中的元素和参数的交集。 |
distinct([numPartitions])) | 去重,返回包含源数据集的不同元素的新数据集。 |
groupByKey([numPartitions]) | 当对一个(K, V)对的数据集调用时,返回一个(K,可迭代)对的数据集。注意:如果您要对每个键进行分组以执行聚合(比如求和或平均),那么使用reduceByKey或aggregateByKey将产生更好的性能。注意:默认情况下,输出中的并行级别取决于父RDD的分区数量。您可以传递一个可选的numPartitions参数来设置不同数量的任务。 |
reduceByKey(func, [numPartitions]) | 在(K,V)对的数据集上调用时,返回一个(K,V)对的数据集,其中每个键的值使用给定的reduce函数func进行聚合,该函数的类型必须是(V,V)=>V。与groupByKey一样,reduce任务的数量可以通过可选的第二个参数进行配置。 |
aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions]) | 当对一个(K, V)对的数据集调用时,返回一个(K, U)对的数据集,其中每个键的值使用给定的combine函数和一个中立的“零”值进行聚合。允许不同于输入值类型的聚合值类型,同时避免不必要的分配。与groupByKey类似,reduce任务的数量可以通过第二个可选参数进行配置。 |
sortByKey([ascending], [numPartitions]) | 当对一个(K, V)对的数据集(K, V)调用时,K实现有序,返回一个(K, V)对的数据集,按键序升序或降序排序,如布尔升序参数中指定的那样。 |
join(otherDataset, [numPartitions]) | 当对类型(K, V)和(K, W)的数据集调用时,返回一个(K, (V, W))对的数据集,其中包含每个键的所有元素对。通过leftOuterJoin、right touterjoin和fullOuterJoin来支持外部连接。 |
cogroup(otherDataset, [numPartitions]) | 当对类型(K, V)和(K, W)的数据集调用时,返回一个元组(K, (Iterable, Iterable))的数据集。这个操作也称为groupWith。 |
cartesian(otherDataset) | 当对T和U类型的数据集调用时,返回一个(T, U)对的数据集(所有元素对)。 |
pipe(command, [envVars]) | 通过shell命令(例如Perl或bash脚本)管道传输RDD的每个分区。RDD元素被写入到进程的stdin中,并以字符串的RDD形式返回到它的stdout中的行输出。 |
coalesce(numPartitions) | 将RDD中的分区数减少到numPartitions。用于筛选大型数据集后更有效地运行操作。 |
repartition(numPartitions) | 随机重组RDD中的数据,创建更多或更少的分区,并在这些分区之间进行平衡。这总是在网络上对所有数据进行无序处理。 |
repartitionAndSortWithinPartitions(partitioner) | 根据给定的分区器重新分区RDD,并在每个结果分区中按关键字对记录进行排序。这比在每个分区内调用重新分区然后进行排序更有效,因为它可以将排序向下推到无序处理机制中。 |
行动算子(Actions)
行动算子从功能上来说作为一个触发器,会触发提交整个作业并开始执行。从代码上来说,它与转换算子的最大不同之处在于:转换算子返回的还是 RDD,行动算子返回的是非 RDD 类型的值,如整数,或者根本没有返回值。
Action | Meaning |
---|---|
reduce(func) | 使用函数func(接受两个参数并返回一个)聚合数据集的元素。函数应该是可交换的和相联的,从而可以并行计算 |
collect() | 在驱动程序中将数据集的所有元素作为数组返回。这通常在过滤器或其他返回足够小的数据子集的操作之后有用。 |
count() | 返回数据集中元素的数量。 |
first() | 返回数据集的第一个元素(类似于take(1))。 |
take(n) | 返回一个包含数据集前n个元素的数组。 |
takeSample(withReplacement, num, [seed]) | 返回数据集num元素的随机样本数组,可选地预先指定随机数生成器种子,是否进行替换。 |
takeOrdered(n, [ordering]) | 使用自然顺序或自定义比较器返回RDD的前n个元素。 |
saveAsTextFile(path) | 将数据集的元素作为文本文件(或一组文本文件)写入本地文件系统、HDFS或任何其他hadoop支持的文件系统的给定目录中。Spark将对每个元素调用toString,将其转换为文件中的一行文本。 |
saveAsSequenceFile(path)(Java and Scala) | 在本地文件系统、HDFS或任何其他Hadoop支持的文件系统的给定路径中,将数据集的元素作为Hadoop序列文件编写。这在实现Hadoop可写接口的键值对RDDs上可用。在Scala中,它还可以用于隐式转换为可写的类型(Spark包括基本类型的转换,如Int、Double、String等)。 |
saveAsObjectFile(path)(Java and Scala) | 使用Java序列化以简单的格式编写数据集的元素,然后可以使用SparkContext.objectFile()加载这些元素。 |
countByKey() | 只在类型(K, V)的RDDs上可用。返回一个(K, Int)对的hashmap,并记录每个键的计数。 |
foreach(func) | 对数据集的每个元素运行函数func。这通常是为了避免副作用,如更新累加器或与外部存储系统交互。注意:在foreach()之外修改除累加器以外的变量可能会导致未定义的行为。有关更多详细信息,请参见理解闭包。 |