讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在Spark SQL中避免GROUP BY引起的Shuffle数据移动

陌宇吖_9486

陌宇吖_9486

发布时间:2026-11-02 12:21:17

|

757人浏览过

|

来源于php中文网

原创

GROUP BY 一定触发 Shuffle,因其需将相同 key 的数据拉至同一 executor 完成聚合;Spark SQL 的 groupBy.agg 默认启用 map-side 预聚合,而 groupByKey 无预聚合易 OOM;应前置过滤、投影、哈希截断,并对倾斜 key 加盐或两阶段聚合。

怎样在spark sql中避免group by引起的shuffle数据移动

GROUP BY 为什么一定触发 Shuffle

Spark SQL 中的 GROUP BY 是逻辑聚合操作,底层必须把相同 key 的所有记录拉到同一个 executor 上才能完成聚合。这意味着无论数据原本在哪个 partition,只要 key 相同,就必须跨 partition 移动——这就是 Shuffle 的本质。不存在“不 shuffle 的 GROUP BY”,只有“shuffle 少不多”的差别。

用 reduceByKey / aggregateByKey 替代 groupByKey(在 DataFrame 层对应为 agg + groupBy)

很多人误以为 groupBy(...).agg(...) 和 groupByKey 是一回事,其实 Spark SQL 的 groupBy 默认已启用 map-side 预聚合(类似 reduceByKey),只要聚合函数支持部分合并(如 sum、count、avg),就会先在每个 partition 内局部计算,再 shuffle 合并结果。但如果你写的是 groupByKey().map(...) 这种 RDD 风格代码,就完全绕过了预聚合,会把所有原始数据全量 shuffle。

  • ✅ 正确: df.groupBy("user_id").agg(sum("amount"), count("*")) —— 自动预聚合,shuffle 数据量小
  • ❌ 危险: rdd.groupByKey().mapValues(it => it.sum) —— 全量 value shuffle,易 OOM
  • ⚠️ 注意:自定义 UDAF 若未实现 merge 方法,则无法预聚合,等效于 groupByKey

提前过滤和投影,减少 shuffle 数据体积

Shuffle 的开销和传输字节数强相关。哪怕逻辑上必须 GROUP BY,也能通过前置裁剪显著降压:

  • 在 GROUP BY 前加 filter,比如 WHERE dt = '2026-10-01',避免把历史冷数据也拉进来 shuffle
  • 用 select 只保留分组键和聚合字段,去掉无关列(如长文本、JSON 字段),否则这些字段也会被序列化传输
  • 对字符串 key 做哈希截断(如 substr(md5(user_id), 1, 8))可减小网络传输量,但需确认业务是否允许 key 模糊

遇到数据倾斜时,别硬扛 GROUP BY

当某个 key 占比超 10%,GROUP BY 的 shuffle 就会卡在一个 task 上。此时强行优化 shuffle 参数意义不大,应改写逻辑:

  • NULL key 单独处理:UNION ALL 把 IS NULL 和非空分支拆开聚合
  • 热点 key 加盐:用 CASE WHEN user_id = 'hot_user' THEN concat('salt_', floor(rand(123) * 20), '_', user_id) ELSE user_id END,注意必须固定 seed
  • 两阶段聚合:第一阶段加盐分组汇总,第二阶段去盐合并,确保二次聚合只处理少量中间结果

真正难的不是写出不 shuffle 的语句,而是判断“这个 GROUP BY 是否真的不可替代”——有时候换掉它(比如改用窗口函数或预计算表)比调优更有效。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5876

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1269

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

526

2026.01.05

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4749

2023.11.02

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

0

2026.11.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn