SparkCore - RDD & 常用算子

RDD概述

RDD是弹性分布式数据集,是Spark的基石,是Spark最基本的数据抽象,它代表一个不可变、只读的、被分区的数据集。RDD不可变,一旦生产就不能改变了,RDD必然是有子类实现的,在使用的时候直接使用子类即可。


RDD的五大特性
  • A list of partitions
    当RDD存储着一系列的数据时,会构建多个partition来存储这些数据,不同的partition会在不同的地址,并且,在Spark中一个数据集有多少个partition就会有多少个task

  • A function for computing each split
    一个函数的计算会作用到每个分片(分区)上,例如:
    RDD由三个partition构成,运用rdd.map()的时候就会同时作用到3个partition上

  • A list of dependencies on other RDDS
    在其他RDD上有一系列的依赖,当对一个RDD进行计算操作后将会得到一个新的RDD,那么每一次的操作得到的RDD都是依赖于原来的RDD的,例如:
    RDD A 进行map操作 ==> RDD B 这两者就有依赖关系

  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
    可选地,当RDD元素是key-value的时候,会有一个专门的partitioner对数据进行分区

  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
    可选地,计算每个分区的首选位置列表(例如,HDFS文件的块位置)


RDD创建方式
  • 并行化创建RDD
val rdd = sc.parallelize(Array(1,2,3,4,5)
  • 外部数据源创建RDD
val rdd = sc.textFile("file:///d:/access.log")

RDD常用算子

RDD算子分为transformation和action两种类别,transformation的操作都是有惰性特点的。并且只有action的操作才会产生job.

  • Transformation
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提供了表示分区索引的整数值,因此当在类型T的RDD上运行时,func必须是类型(Int,Iterator )=> Iterator
sample(withReplacement, fraction, seed)使用给定的随机数生成器种子,在有或没有替换的情况下对数据的一小部分进行采样。
union(otherDataset)返回一个新数据集,其中包含源数据集和参数中元素的并集。
intersection(otherDataset)返回包含源数据集和参数中元素交集的新RDD。
distinct([numPartitions]))返回包含源数据集的不同元素的新数据集。
groupByKey([numPartitions])在(K,V)对的数据集上调用时,返回(K,Iterable )对的数据集。 注意:如果要进行分组以便对每个密钥执行聚合(例如总和或平均值),则使用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)对的数据集,其中使用给定的组合函数和中性“零”值聚合每个键的值。允许与输入值类型不同的聚合值类型,同时避免不必要的分配。同样groupByKey,reduce任务的数量可通过可选的第二个参数进行配置。
sortByKey([ascending], [numPartitions])当在K实现Ordered的(K,V)对的数据集上调用时,返回按键按升序或降序排序的(K,V)对的数据集,如布尔ascending参数中所指定的。
join(otherDataset, [numPartitions])当调用类型(K,V)和(K,W)的数据集时,返回(K,(V,W))对的数据集以及每个键的所有元素对。外连接通过支持leftOuterJoin,rightOuterJoin和fullOuterJoin。
cogroup(otherDataset, [numPartitions])当调用类型(K,V)和(K,W)的数据集时,返回(K,(Iterable ,Iterable ))元组的数据集。此操作也称为groupWith。
cartesian(otherDataset)当调用类型为T和U的数据集时,返回(T,U)对的数据集(所有元素对)。
pipe(command, [envVars])通过shell命令管道RDD的每个分区,例如Perl或bash脚本。RDD元素被写入进程的stdin,并且输出到其stdout的行将作为字符串的RDD返回。
coalesce(numPartitions)将RDD中的分区数减少为numPartitions。过滤大型数据集后,可以更有效地运行操作。
repartition(numPartitions)随机重新调整RDD中的数据以创建更多或更少的分区并在它们之间进行平衡。这总是随机播放网络上的所有数据。
repartitionAndSortWithinPartitions(partitioner)根据给定的分区重新分区RDD,并在每个生成的分区内按键对记录进行排序。这比repartition在每个分区中调用然后排序更有效,因为它可以将排序推送到shuffle机器中。
  • Action
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)将数据集的元素作为Hadoop SequenceFile写入本地文件系统,HDFS或任何其他Hadoop支持的文件系统中的给定路径中。这可以在实现Hadoop的Writable接口的键值对的RDD上使用。在Scala中,它也可以在可隐式转换为Writable的类型上使用(Spark包括基本类型的转换,如Int,Double,String等)。
saveAsObjectFile(path) (Java and Scala)使用Java序列化以简单格式编写数据集的元素,然后可以使用它进行加载 SparkContext.objectFile()。
countByKey()仅适用于类型(K,V)的RDD。返回(K,Int)对的散列映射,其中包含每个键的计数。
foreach(func)在数据集的每个元素上运行函数func。这通常用于副作用,例如更新累加器或与外部存储系统交互。 注意:修改除累加器之外的变量foreach()可能会导致未定义的行为。有关详细信息,请参阅了解闭包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值