RDD,弹性分布式数据集,是一种提供了许多操作的数据集合,具有五大特性:
1.A list of partitions
RDD是一个由多个partition(某个节点里的某一片连续的数据)组成的的List;将数据加载为RDD时,一般一个hdfs里的block会加载为一个partition。
2.A function for computing each split
RDD的每个partition上面都会有function,也就是函数应用,其作用是实现RDD之间partition的转换。
3.A list of dependencies on other RDDs
RDD会记录它的依赖 ,为了容错,也就是说在内存中的RDD操作时出错或丢失会进行重算。
4.Optionally,a Partitioner for Key-value RDDs
可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面
5.Optionally, a list of preferred locations to compute each split on
最优的位置去计算,也就是数据的本地性。
RDD主要有两大操作:转换(Transformations)和操作(Actions):
Transformations
Transformation | 描述 |
---|---|
map(func) | 通过应用一个函数的所有元素,返回一个新的分布式数据集 |
filter(func) | 通过选择函数返回true的那些元素来形成,返回一个新的数据集 |
flatMap(func) | 与map类似,但每个输入项都可以映射到0个或多个输出项(因此函数应该返回一个序列而不是单个项) |
mapPartitions(func) | 与map类似,但运行在RDD的每个分区(块),所以函数必须是迭代器Iterator => Iterator,当运行在一个类型T的RDD |
mapPartitionsWithIndex(func) | 与mapPartitions类似,但也为函数提供一个表示分区索引的整数值,所以函数必须是(Int, Iterator) => Iterator类型当运行在一个类型T的RDD |
sample(withReplacement, fraction, seed) | 使用给定随机数字生成器的种子,对数据的一小部分进行采样,无论有无替换 |
union(otherDataset) | 返回一个新的数据集,其中包含源数据集和参数中的元素的联合 |
intersection(otherDataset) | 返回一个新的RDD,它包含源数据集和参数中的元素的交集 |
distinct([numTasks])) | 返回一个包含源数据集的不同元素的新数据集 |
groupByKey([numTasks]) | 当调用一个(K, V)对的数据集时,返回一个(K, 可迭代的)对的数据集。注意:如果要对每个键执行聚合(如汇总或平均值),使用简化的方法或聚合键将会获得更好的性能。注意:在默认情况下,输出的并行度取决于父RDD分区的数量,你可以通过一个可选的numTasks参数来设置不同数量的任务。 |
reduceByKey(func, [numTasks]) | 当调用(K, V)的数据集对,返回一个数据集(K, V)对每个键的值在哪里聚合使用给定减少函数func,必须(V, V) => V形似groupByKey,减少任务的数量通过一个可选的第二个参数是可配置的。 |
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) | 当调用一个(K, V)对的数据集时,返回一个(K, U)对的数据集,其中每个键的值使用给定的组合函数和一个中立的“零”值进行聚合。允许一个与输入值类型不同的聚合值类型,同时避免不必要的分配。与groupByKey一样,reduce任务的数量是通过可选的第二个参数进行配置的。 |
sortByKey([ascending], [numTasks]) | 当调用一个(K, V)对K实现排序的数据集时,返回一个由按升序或降序排列的(K, V)对的数据集,如布尔提升参数中所指定的那样。 |
join(otherDataset, [numTasks]) | 当调用类型的数据集(K,V)和(K,W)时,返回一个数据集(K,(V,W))对每一个键的所有对元素。外部连接通过左外连接、右外连接与全外连接。 |
cogroup(otherDataset, [numTasks]) | 当调用类型的数据集(K,V)和(K,W)时,返回一个 (K, (Iterable, Iterable)) 元素的数据集。这个操作也称为group分组。 |
cartesian(otherDataset) | 当调用类型T和U的数据集时,返回一个(T,U)对(所有对元素)的数据集。 |
pipe(command, [envVars]) | 通过shell命令对RDD的每个分区进行管道,例如Perl或bash脚本。RDD元素被写入到进程的stdin中,输出到其stdout的输出被作为字符串的RDD返回。 |
coalesce(numPartitions) | 将RDD中的分区数量减少到num分区。在过滤大数据集之后,可以更有效地运行操作。 |
repartition(numPartitions) | 对RDD中的数据进行随机重组,以创建多个或更少的分区,并在它们之间进行平衡。这通常会使网络上的所有数据都被打乱。 |
repartitionAndSortWithinPartitions(partitioner) | 根据给定的分区重新分区RDD,在每个结果分区中,根据它们的键对记录进行排序。这比调用重新分区更有效,然后在每个分区中进行排序,因为它可以将排序推入到洗牌机器中。 |
Actions
Action | 描述 |
---|---|
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() | 只有在类型的rdd(K,V)上才可用。返回一个hashmap(K,Int)对每个键的计数。 |
foreach(func) | 在数据集的每个元素上运行一个函数func。这通常是为了一些副作用,比如更新一个累加器或者与外部存储系统进行交互。注意:除了foreach()之外的累计变量之外,修改变量可能导致未定义的行为。请参阅理解闭包,了解更多细节。 |