大数据学习(33)-spark-transformation算子

&&大数据学习&&
🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门

💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


Spark Transformation算子

是指对RDD(弹性分布式数据集)进行操作的一系列函数,用于转换或修改数据。这些操作是惰性的,意味着它们不会立即执行,而是等到一个Action操作触发时才会执行。只有当遇到Action操作时,Spark才会从血缘关系的源头开始,进行物理的转换操作,触发实际的计算。

Spark提供了多种Transformation算子,以下是常见的几类及其功能:

  1. 一对一转换

    • map(func):对RDD中的每个元素应用func函数,并返回一个新的RDD。这是最基本的转换操作。
    • filter(func):返回一个新RDD,该RDD包含源RDD中满足func函数返回true的所有元素。
  2. 一对多转换

    • flatMap(func):类似于map,但每个输入元素可以映射到0个或多个输出元素。func函数应返回一个序列(Seq)而不是单个项。
  3. 针对分区操作

    • mapPartitions(func):与map类似,但func函数在整个分区(块)上单独运行。因此,当在类型为T的RDD上运行时,func的类型必须是Iterator[T]=>Iterator[U]。
    • mapPartitionsWithIndex(func):与mapPartitions类似,但还为func提供了一个表示分区索引的整数值。因此,当在类型为T的RDD上运行时,func的类型必须为(Int, Iterator[T])=>Iterator[U]。
  4. 采样与分区

    • sample(withReplacement, fraction, seed):使用给定的随机数生成器种子对RDD中的数据进行采样。可以指定是否使用替换(withReplacement),以及采样的比例(fraction)。
    • coalesce(numPartitions):减少RDD中的分区数到指定的分区数。注意,如果分区数变多,则会发生shuffle。
    • repartition(numPartitions):随机重新洗牌RDD中的数据,以创建更多或更少的分区,并在它们之间平衡数据。
    • repartitionAndSortWithinPartitions(partitioner):根据给定的分区器对RDD进行重新分区,并在每个生成的分区中按键对记录进行排序。
  5. 集合操作

    • union(otherDataset):返回一个新RDD,该RDD包含源数据集中元素的并集和参数数据集中的元素。
    • intersection(otherDataset):返回一个新RDD,该RDD包含源数据集中元素的交集和参数数据集中的元素。
    • distinct([numPartitions]):返回包含源数据集不同元素的新RDD。
  6. 键值对操作

    • groupByKey([numPartitions]):在(K,V)对的数据集上调用时,返回(K,Iterable[V])对的数据集。注意,如果要分组以对每个键执行聚合(如总和或平均值),则使用reduceByKey或aggregateByKey可能会产生更好的性能。
    • reduceByKey(func, [numPartitions]):在(K,V)对的数据集上调用时,返回(K,V)对的数据集,其中每个键的值使用给定的reduce函数func进行聚合。
    • aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions]):在(K,V)对的数据集上调用时,返回(K,U)对的数据集,其中每个键的值使用给定的组合函数和中性的"零"值进行聚合。这允许使用与输入值类型不同的聚合值类型,同时避免不必要的分配。
    • sortByKey([ascending], [numPartitions]):在实现了Order接口的(K,V)对数据集上调用时,返回按键排序的(K,V)对数据集。
    • join(otherDataset, [numPartitions]):在类型为(K,V)和(K,W)的数据集上调用时,返回(K,(V,W))对的数据集,其中包含每个键的所有元素对。支持内连接、左外连接、右外连接和全外连接。
    • cogroup(otherDataset, [numPartitions]):当调用类型为(K,V)和(K,W)的数据集时,返回(K,(Iterable[V],Iterable[W]))元组的数据集。
    • 尽量避免使用宽依赖的Transformation算子(如groupByKey),因为它们可能会导致数据倾斜和性能下降。可以使用reduceByKey或aggregateByKey等具有本地预聚合操作的算子来替代。
    • 在进行大规模数据处理时,合理设置分区数(numPartitions)以平衡计算资源和数据分布。

虽然Spark Transformation算子提供了丰富的数据转换功能,具有惰性执行和高效处理大规模数据的能力。在使用时,需要根据具体场景选择合适的算子,并注意避免性能瓶颈和数据倾斜等问题。

相关推荐
多多*几秒前
深入架构剖析 博客点赞逻辑 strategy 策略模式 策略接口 上下文 具体策略 项目实战
开发语言·学习·架构·bash·intellij-idea·策略模式
2401_8914092619 分钟前
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250102
大数据·数据库·python·金融·数据库开发
从善若水1 小时前
【Rust学习笔记】Rust 的所有权介绍
笔记·学习·rust
JermeryBesian1 小时前
Flink系统知识讲解之:容错与State状态管理
java·大数据·flink
fnd_LN2 小时前
HTML学习笔记记录---速预CSS(1) 选择器类型
css·笔记·学习·html
无奈ieq3 小时前
spark汇总
大数据·分布式·spark
weixin_307779133 小时前
理解Spark中运行程序时数据被分区的过程
大数据·分布式·spark
zfj3213 小时前
学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用
大数据·elasticsearch·搜索引擎·logstash·elastic agent·与第三方集成
无奈ieq3 小时前
Spark Streaming专题
大数据·spark