sparkRDD操作,转换算子和行动算子

RDD介绍

在Spark中,RDD代表弹性分布式数据集(Resilient Distributed Dataset),是一种可以并行计算的、不可变的分布式数据结构。它们可以跨多个节点分区,并且支持在数据上执行各种转换和操作,包括映射、过滤、缩减等。RDD是Spark最基本的抽象之一,它是Spark提供的一种高级API,允许用户以更高层次的抽象方式来处理大规模数据集。

RDD操作

RDD支持许多操作,以下是其中一些常见的操作:转换操作,行动操作,持久化操作,分区操作,排序操作,这些操作可以帮助您对RDD进行各种处理,以满足不同的数据分析和处理需求。值得注意的是,大多数转换操作都是惰性的,只有当触发行动操作时才会执行,这就是Spark的“懒加载”机制。

RDD transformations(转换)

转换 解释
map(func) 返回一个新的分布式数据集,将数据源的每一个元素传递给函数 func 映射组成。
filter(func) 返回一个新的数据集,从数据源中选中一些元素通过函数 func 返回 true。
flatMap(func) 类似于 map,但是每个输入项能被映射成多个输出项(所以 func 必须返回一个 Seq,而不是单个 item)。
mapPartitions(func) 类似于 map,但是分别运行在 RDD 的每个分区上,所以 func 的类型必须是 当运行在类型为 T 的 RDD 上
mapPartitionsWithIndex(func) 类似于 mapPartitions,但是 func 需要提供一个 integer 值描述索引(index),所以 func 的类型必须是 (Int, Iterator) => Iterator 当运行在类型为 T 的 RDD 上
sample(withReplacement, fraction, seed) 对数据进行采样。
union(otherDataset) 返回一个新的数据集,该数据集包含源数据集中元素和参数的并集。
intersection(otherDataset) 返回一个新的RDD,该RDD包含源数据集中元素和参数的交集。
distinct([numTasks])) 返回一个新的数据集,该数据集包含源数据集的不同元素。
groupByKey([numTasks]) 当对(K,V)对的数据集调用时,返回(K,Iterable)对的一个数据集。注意:如果您正在分组以便对每个键执行聚合(例如求和或平均),则使用reduceByKey或combineByKey将产生更好的性能。注意:默认情况下,输出中的并行度取决于父RDD的分区数。您可以传递一个可选的numTasks参数来设置不同数量的任务。
reduceByKey(func, [numTasks]) 当在(K,V)对的数据集上调用时,返回一个由(K,V)对组成的数据集,其中每个键的值都是使用给定的reduce函数func聚合的,该函数的类型必须为(V,V)=>V。与groupByKey中一样,reduce任务的数量可以通过可选的第二个参数进行配置。
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 当在(K,V)对的数据集上调用时,返回(K,U)对数据集,其中使用给定的组合函数和中性“零”值聚合每个键的值。允许不同于输入值类型的聚合值类型,同时避免不必要的分配。与groupByKey中一样,reduce任务的数量可以通过可选的第二个参数进行配置。
sortByKey([ascending], [numTasks]) 在K实现Ordered的(K,V)对数据集上调用时,返回按布尔升序参数中指定的升序或降序键排序的(K、V)对的数据集。
join(otherDataset, [numTasks]) 当在类型为(K,V)和(K,W)的数据集上调用时,返回一个(K,(V,W))对的数据集,其中每个键都有所有元素对。通过leftOuterJoin和rightOuterJoin也支持外部联接。
cogroup(otherDataset, [numTasks]) 当在类型为(K,V)和(K,W)的数据集上调用时,返回一个(K,Iterable,Iteraable)元组的数据集。此操作也称为groupWith。
cartesian(otherDataset) 在T和U类型的数据集上调用时,返回(T,U)对(所有元素对)的数据集。
pipe(command, [envVars]) 通过shell命令(例如Perl或bash脚本)对RDD的每个分区进行管道传输。RDD元素被写入进程的stdin,输出到其stdout的行作为字符串的RDD返回。
coalesce(numPartitions) 将RDD中的分区数减少到numPartitions。用于在筛选大型数据集后更有效地运行操作。
repartition(numPartitions) 随机重新混洗RDD中的数据,以创建更多或更少的分区,并在它们之间进行平衡。这总是打乱网络上的所有数据。

RDD Actions(行动)

行动 解释
reduce(func) 使用函数func(接受两个参数并返回一个参数)聚合数据集的元素。函数应该是可交换的和可结合的,这样才能正确地并行计算。
collect() 在驱动程序中将数据集的所有元素作为数组返回。这通常在过滤器或其他返回足够小的数据子集的操作之后很有用。
count() 返回数据集中的元素数。
first() 返回数据集的第一个元素(类似于take(1))。
take(n) 返回一个数组,该数组包含数据集的前n个元素。请注意,这目前不是并行执行的。相反,驱动程序计算所有元素。
takeSample(withReplacement, num, [seed]) 返回一个数组,该数组包含数据集num个元素的随机样本,可以替换也可以不替换,也可以预先指定随机数生成器种子。
takeOrdered(n, [ordering]) 使用RDD的自然顺序或自定义比较器返回RDD的前n个元素。
saveAsTextFile(path) 将数据集的元素作为文本文件(或文本文件集)写入本地文件系统、HDFS或任何其他Hadoop支持的文件系统中的给定目录中。Spark将对每个元素调用toString,将其转换为文件中的一行文本。
saveAsSequenceFile(path) (Java and Scala) 将数据集的元素作为Hadoop SequenceFile写入本地文件系统、HDFS或任何其他Hadoop支持的文件系统中的给定路径。这在实现Hadoop可写接口的键值对的RDD上是可用的。在Scala中,它也可用于隐式转换为可写的类型(Spark包括Int、Double、String等基本类型的转换)。
saveAsObjectFile(path) (Java and Scala) 使用Java序列化以简单的格式编写数据集的元素,然后可以使用SparkContext.objectFile()加载。
countByKey() 仅适用于(K、V)类型的RDD。返回一个(K,Int)对的哈希映射,其中包含每个键的计数。
foreach(func) 对数据集的每个元素运行一个函数func。这样做通常是为了产生副作用,例如更新累加器变量(见下文)或与外部存储系统交互。

总结

RDD是Spark中最重要的抽象概念之一,它提供了一个高度可扩展且容错的计算模型。通过允许开发人员在内存中进行数据处理和分析,RDD使得Spark能够比传统的MapReduce框架更加高效地进行大规模数据处理。此外,RDD还提供了丰富的转换和操作,例如map、filter、reduce等,在数据处理中具有不可替代的作用。

虽然现在已经有了更先进的Spark Dataset和DataFrame API,但是RDD在Spark生态系统中仍然具有非常重要的地位。因为RDD允许将数据分布式存储在集群中的多个节点上,并且强制执行数据的不变性,这些特性使得RDD能够在分布式环境中高效地进行计算和处理。因此,RDD将继续为大规模数据处理和分析领域做出贡献,并成为未来数据处理技术的基础。

猜你喜欢

转载自blog.csdn.net/m0_58353740/article/details/129860122