当前位置: 首页 > java >正文

区分:union(),coalesce () 和 repartition ()

一、合并的对象:数据 vs 分区

Spark 中需要区分两个概念:

  • 数据(Data):RDD 中的元素(如 [1, 2, 3])。
  • 分区(Partitions):数据的物理存储单位,分布在集群的不同节点上。

这三个算子的 “合并” 对象不同:

  • union():合并数据(将多个 RDD 的元素叠加)。
  • coalesce () 和 repartition ():合并分区(调整数据的物理分布)。

二、union ():合并数据(不改变分区)

核心逻辑
  • 将多个 RDD 的元素合并成一个新的 RDD。
  • 分区数 = 原 RDD 分区数之和,每个 RDD 的分区保持独立。
示例

假设有两个 RDD:

scala

// RDD 1:2个分区
val rdd1 = sc.parallelize(Seq(1, 2, 3), 2)  // 分区0: [1, 2], 分区1: [3]// RDD 2:3个分区
val rdd2 = sc.parallelize(Seq(4, 5, 6), 3)  // 分区0: [4], 分区1: [5], 分区2: [6]

执行 union ():

scala

val unionRdd = rdd1.union(rdd2)  // 共5个分区(2+3)
unionRdd.glom().collect()        // 查看分区内容
结果可视化

plaintext

rdd1:分区0 -> [1, 2]分区1 -> [3]rdd2:分区0 -> [4]分区1 -> [5]分区2 -> [6]union_rdd:分区0 -> [1, 2]    # rdd1的分区0分区1 -> [3]       # rdd1的分区1分区2 -> [4]       # rdd2的分区0分区3 -> [5]       # rdd2的分区1分区4 -> [6]       # rdd2的分区2
关键点
  • 数据合并:rdd1 和 rdd2 的元素被放到一起。
  • 分区独立:每个 RDD 的分区保持原样,只是简单叠加。

三、coalesce () 和 repartition ():合并分区(调整数据分布)

核心逻辑
  • 合并分区:将同一个 RDD 的多个分区物理合并为更少的分区(或通过 shuffle 重新分布)。
  • 数据可能重新分布:通过移动数据实现分区合并。
示例:coalesce (2)

假设初始 RDD 有 4 个分区:

scala

执行 coalesce (2)(合并为 2 个分区):

scala

val coalescedRdd = rdd.coalesce(2)  // 合并为2个分区
coalescedRdd.glom().collect()
结果可视化
原 rdd:分区0 -> [1, 2]分区1 -> [3, 4]分区2 -> [5, 6]分区3 -> [7, 8]coalesced_rdd(合并相邻分区):分区0 -> [1, 2, 3, 4]    # 合并原分区0和1分区1 -> [5, 6, 7, 8]    # 合并原分区2和3
repartition () 的区别

如果用 repartition (2):

scala

val repartitionedRdd = rdd.repartition(2)  // 重新分区为2个
repartitionedRdd.glom().collect()
结果可视化
repartitioned_rdd(通过shuffle均匀分布):分区0 -> [1, 3, 5, 7]    # 数据被打散到新分区分区1 -> [2, 4, 6, 8]
关键点
  • 分区合并:将原本分散的分区物理合并为更少的分区。
  • 数据移动:coalesce () 尽量不 shuffle(合并相邻分区),而 repartition () 强制 shuffle 以保证数据均匀。

四、对比总结

算子合并对象是否改变分区数数据是否 shuffle核心场景
union()多个 RDD 的数据是(叠加原分区数)快速合并多个数据集
coalesce()同一个 RDD 的分区是(通常减少)否(默认)减少分区数,避免 shuffle
repartition()同一个 RDD 的分区是(任意调整)彻底重分区,解决数据倾斜

五、常见误区解答

1. union () 会合并分区吗?

不会!union () 只是将多个 RDD 的分区简单叠加,分区数等于原 RDD 分区数之和。例如:

scala

val rdd1 = sc.parallelize(Seq(1, 2), 1)  // 1个分区
val rdd2 = sc.parallelize(Seq(3, 4), 1)  // 1个分区
val unionRdd = rdd1.union(rdd2)           // 2个分区(1+1)
2. coalesce () 和 repartition () 的合并有什么不同?
  • coalesce():通过合并相邻分区实现,不 shuffle(默认),可能导致数据倾斜。

    scala

    rdd.coalesce(1)  // 合并为1个分区,数据可能集中在一个节点
    
  • repartition():通过 shuffle 重新分布数据,分区更均匀,但开销大。

    scala

    rdd.repartition(10)  // 增加到10个分区,数据被打散
    

六、一句话总结

  • union():多个 RDD 的数据合并(分区数叠加)。
  • coalesce()/repartition():同一个 RDD 的分区合并(调整数据分布)。
http://www.xdnf.cn/news/8108.html

相关文章:

  • ProtoBuffer在Android端的编译
  • 网络编程 之网络七层模型、TCPUDP协议、JAVA IO 发展历程
  • 【2025-05-22】centos 离线安装兼容node和npm版本的pm2 和 yarn
  • 2025软考高级信息系统项目管理师英文选择题---技术类常见英语词汇
  • python 绘制3D平面图
  • 【记录】PPT|PPT打开开发工具并支持Quicker VBA运行
  • NLP学习路线图(四):Python编程语言
  • 从零开始:用Python语言基础构建宠物养成游戏:从核心知识到完整实战
  • 高速信号处理中的去加重、预加重与均衡技术
  • CUDA 加速的稀疏矩阵计算库cuSPARSE
  • 自动获取ip地址安全吗?如何自动获取ip地址
  • 【Day33】
  • 【项目】抽奖系统bug历程(持续更新)
  • 机器学习在智能水泥基复合材料中的应用与实践
  • android:exported=“true“的作用
  • SpringCloud系列教程之Nacos实践指南
  • Redis缓存更新策略,穿透,雪崩,击穿
  • 卓力达靶标:精密制造赋能材料沉积技术革新
  • 基于springboot+vue的人口老龄化社区服务与管理平台(源码+数据库+文档)
  • 【五】Spring Cloud微服务开发:解决版本冲突全攻略
  • 【小乌龙问题】stm32供电,用过的ch340缺无法被识别
  • Class-D音频功放LC滤波器设计
  • 如何使用Selenium进行网页自动化?
  • AWS中国区中API Gateway中403的AccessDeniedException问题
  • Spring Boot与Kafka集成实践:实现高效消息队列
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio和Cherry Studio快速构建午餐管家助手
  • (Git) 稀疏检出(Sparse Checkout) 拉取指定文件
  • 第二届帕鲁杯 solar_Linux后门排查 WP
  • 系统性能分析基本概念(4) : 何时停止性能分析
  • 2025年三级等保实施全解析:技术升级与云等保方案深度实践