Spark RDD操作
RDD提供了两种类型的操作:
- 转换
- 动作
转换
在Spark中,转换的作用是从现有的数据集中创建一个新的数据集。转换是延迟计算的,只有当动作需要将结果返回给驱动程序时才会计算。
让我们看一些经常使用的RDD转换操作。
转换 | 描述 |
---|---|
map(func) | 通过将源的每个元素传递给函数func,返回一个新的分布式数据集。 |
filter(func) | 返回一个新的数据集,由源上那些func返回true的元素组成。 |
flatMap(func) | 这里,每个输入项可以映射到零个或多个输出项,所以func应该返回一个序列而不是单个项。 |
mapPartitions(func) | 它类似于map,但在RDD的每个分区(块)上分别运行,因此当在类型T的RDD上运行时,func必须是Iterator |
mapPartitionsWithIndex(func) | 类似于mapPartitions函数,它提供了一个整数值作为表示分区索引的参数给func函数,因此当在类型为T的RDD上运行时,func必须是类型为(Int, Iterator) => Iterator _的函数。 |
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]) | 将RDD的每个分区通过一个shell命令进行管道处理,例如Perl或bash脚本。 |
coalesce(numPartitions) | 将RDD中的分区数量减少到numPartitions。 |
repartition(numPartitions) | 将RDD中的数据随机重新分区,以创建更多或更少的分区,并在它们之间进行平衡。 |
repartitionAndSortWithinPartitions(partitioner) | 根据给定的partitioner重新分区RDD,并在每个结果分区内按键对记录进行排序。 |
操作
在Spark中,操作的作用是在数据集上运行计算后将一个值返回给驱动程序。
让我们来看一些常用的RDD操作。
作用 | 描述 |
---|---|
reduce(func) | 使用函数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,以进行更新累加器或与外部存储系统交互等副作用。 |