RDD 操作

2024年8月28日 | 阅读 4 分钟

RDD 提供两种类型的操作

  • 转换
  • 操作

转换

在 Spark 中,转换的作用是从现有数据集创建新数据集。 转换被认为是惰性的,因为它们仅在操作需要将结果返回到驱动程序时才进行计算。

让我们看看一些常用的 RDD 转换。

转换描述
map(func)它通过将源的每个元素传递给函数 func,返回一个新的分布式数据集。
filter(func)它通过选择 func 返回 true 的源的那些元素来返回新的数据集。
flatMap(func)这里,每个输入项可以映射到零个或多个输出项,因此 func 应该返回一个序列而不是单个项。
mapPartitions(func)它类似于 map,但在 RDD 的每个分区(块)上单独运行,因此在类型 T 的 RDD 上运行时,func 必须是 Iterator<T> => Iterator<U> 类型。
mapPartitionsWithIndex(func)它类似于 mapPartitions,为 func 提供一个整数值,表示分区的索引,因此在类型 T 的 RDD 上运行时,func 必须是 (Int, Iterator<T>) => Iterator<U> 类型。
sample(withReplacement, fraction, seed)它使用给定的随机数生成器种子,以有或没有替换的方式对 fraction 的数据进行抽样。
union(otherDataset)它返回一个新的数据集,其中包含源数据集和参数中元素的并集。
intersection(otherDataset)它返回一个新的 RDD,其中包含源数据集和参数中元素的交集。
distinct([numPartitions]))它返回一个新的数据集,其中包含源数据集的不同元素。
groupByKey([numPartitions])当在 (K, V) 对的数据集上调用时,它返回 (K, Iterable) 对的数据集。
reduceByKey(func, [numPartitions])当在 (K, V) 对的数据集上调用时,返回 (K, V) 对的数据集,其中每个键的值使用给定的 reduce 函数 func 进行聚合,该函数必须是 (V,V) => V 类型。
aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions])当在 (K, V) 对的数据集上调用时,返回 (K, U) 对的数据集,其中每个键的值使用给定的组合函数和一个中性的“零”值进行聚合。
sortByKey([ascending], [numPartitions])它返回按键升序或降序排序的键值对数据集,如布尔 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 命令(例如 Perl 或 bash 脚本)传递 RDD 的每个分区。
coalesce(numPartitions)它将 RDD 中的分区数减少到 numPartitions。
repartition(numPartitions)它随机地重新洗牌 RDD 中的数据,以创建更多或更少的分区,并在它们之间进行平衡。
repartitionAndSortWithinPartitions(partitioner)它根据给定的分区器重新分区 RDD,并在每个结果分区中,按键对记录进行排序。

操作

在 Spark 中,action 的作用是在对数据集进行计算后,将值返回到驱动程序。

让我们看看一些常用的 RDD 操作。

操作描述
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 和 Scala)
它用于将数据集的元素作为 Hadoop SequenceFile 写入本地文件系统、HDFS 或任何其他 Hadoop 支持的文件系统中给定的路径中。
saveAsObjectFile(path)
(Java 和 Scala)
它用于使用 Java 序列化以简单的格式写入数据集的元素,然后可以使用 SparkContext.objectFile() 加载这些元素。
countByKey()它仅在类型为 (K, V) 的 RDD 上可用。 因此,它返回一个 (K, Int) 对的哈希映射,其中包含每个键的计数。
foreach(func)它在数据集的每个元素上运行一个函数 func,以产生副作用,例如更新累加器或与外部存储系统交互。

下一主题RDD 持久化