在前面介绍了RDD之后,这里我们就要介绍下RDD的Transformaion和action操作。这里顺便提一句,在spark应用程序的生命周期里面它也有 数据源->Transformaion->action这样的生命周期,类似于现在很火的flink的生命周期(connector->transform->sink)形式上差不多。这篇文章我们介绍下Spark的Transformaion。
在spark中所有的Transformaion操作都不是立即执行,它会在执行action的时候进行执行,有点类似于java中的懒加载的机制。Transformaion通过操作源RDD然后返回一个新的RDD,常见的Transformaion转换操作有:
先介绍下transform常见的转换操作:
序号 | Transformaion | 说明 |
1 | map(func) | 执行map转换,生成1对1的结果 |
2 | mapPartitions(func) | 通过对源RDD的每个分区应用一个函数来返回一个新的RDD |
3 | mapPartitionsWithIndex(func) | 通过对这个RDD的每个分区应用一个函数来返回一个新的rdd,同时跟踪原始分区的索引。mapPartitionsWithIndex类似于mapPartitions(),但它提供了第二个参数索引,用于跟踪分区。 |
4 | flatMap(func) | 和map类似 |
5 | filter(func) | 通过过滤条件进行过滤 |
6 | sample(withReplacement,fraction,seed) | 返回这个RDD的一个采样子集,其中的参数有: 1、withReplacemen:是否可以对元素进行多次采样(采样后替换) 2、fraction:抽样因子。对于without replacement每个元素被选中的概率,这个值必须是0到1之间的值,对于with replacement,每个元素被选择的期望次数,fraction值必须大于等于0。 3、seed:用于随机数生成器的种子。 |
7 | distinct([numPartitions]) | 返回一个包含这个RDD中不同元素的新RDD |
8 | keyBy(func):RDD[(K,T)] | 当在类型为T的数据集上调用时,返回一个(K,T)元组对的数据集,通过应用func函数创建这个rdd中元素的元组。 |
9 | groupBy(func) | 当在类型为T的数据集上调用时,返回一个(K,Iterable[T])元组的数据集。返回分组项的RDD,每个组由一个key和一系列映射到该key的元素组成。每个组内元素的顺序不能得到保证,甚至在每次计算结果RDD时可能会有所不同。这个方法可能会引起shuffle |
10 | sortBy(func,[ascending],[numPartitions]) | 返回一个给定key函数排序的RDD |
11 | glom():RDD[Array[T]] | 返回将每个分区中的所有元素合并到一个数组中创建的RDD,一个分区,一个数组。当在类型为T的RDD上调用时,返回一个Array[T]的RDD。 |
12 | repartition(numPartitions) | 随机的重新shuffle RDD中的数据,以创建更多或者更少的分区,并在他们之间进行平衡。repartition()用于增加或减少RDD分区。操作这块的时候,建议谨慎处理,因为他会跨多个分区转移数据。 |
13 | coalesce(numPartitions) | 将RDD中的分区数量减少到numPartitions。coalesce()仅用于以一种有效的方式减少分区数量,适用于过滤大型数据集后更有效的运行操作。这是repartition()的优化版本,其中使用合并可以降低跨分区的数据移动。需要注意的一点是,这个操作需要谨慎处理,因为他会跨多个分区转移数据。 |
14 | randomSplit(weights,seed) | 使用提供的权重随机分割这个RDD,以数组形式返回拆分后的RDD(即拆分后的RDD组成的数组并返回)。这里的参数含义如下: 1、weights:分割的权重,如果他们的和不等于1,将被标准化。 2、seed:随机种子。 |
15 |
再介绍下RDD集合运算的Tranformation:
序号 | Transformaion | 说明 |
1 | union(otherDataset) | 计算两个RDD的并集,返回新的RDD |
2 | intersection(otherDataset) | 计算两个RDD的交集,返回新的RDD |
3 | subtract(otherDataset) | 计算两个RDD的差集,返回新的RDD |
4 | cartesian(otherDataset) | 计算两个RDD的笛卡尔集,当在类型为T和U的RDD上调用时,返回一个(T,U)对的RDD |
5 | zip(otherDataset) | 当在类型为T和U的RDD上调用时,返回一个(T,U)对的RDD,其中元组第一个元素来自第一个RDD,第二个元素来自第二个RDD。这类似于拉链操作。假设两个RDD具有相同数量的分区和每个分区中相同数量的元素 |
还没有评论,来说两句吧...