Spark-RDD算子

简介

RDD 算子主要分为两类,一类为转换(transform)算子,一类为行动(action)算子,转换算子主要负责改变 RDD 中数据、切分 RDD 中数据、过滤掉某些数据等,并按照一定顺序组合。Spark 会将转换算子放入一个计算的有向无环图中,并不立刻执行,当 Driver 请求某些数据时,才会真正提交作业并触发计算,而行动算子就会触发 Driver 请求数据。这样设计的原因首先是避免无谓的计算开销,更重要的是 Spark 可以了解所有执行的算子,从而设定并优化执行计划。

官方地址:http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations

转换算子(Transformations)

TransformationMeaning
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 类型的值,如整数,或者根本没有返回值。

ActionMeaning
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()之外修改除累加器以外的变量可能会导致未定义的行为。有关更多详细信息,请参见理解闭包。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值