概述
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
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提供了表示分区索引的整数值,因此当在类型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
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) | 将数据集的元素作为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()可能会导致未定义的行为。有关详细信息,请参阅了解闭包。 |
最后
以上就是开朗哑铃为你收集整理的SparkCore - RDD & 常用算子的全部内容,希望文章能够帮你解决SparkCore - RDD & 常用算子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复