先从最核心的 Catalyst 优化器开始——它是 DataFrame 性能远超手写 RDD 的秘密所在。Catalyst 是 DataFrame 性能的核心引擎DataFrame 最常用的操作——把每类 API 的用法和背后的执行逻辑对应起来三种 Join 类型的内部机制对比这是 SQL 调优最核心的知识点Window 函数和数据读写的完整流程Catalyst 优化器第一张是理解为什么 DataFrame 比 RDD 快的关键答案。写同样逻辑的代码DataFrame 版会经过四个阶段的自动变换未解析逻辑计划 → Analyzer 对照 Catalog 验证列名和类型 → Optimizer 应用规则引擎做谓词下推、列裁剪、常量折叠、Join 重排序 → Physical Planner 选择具体执行算法选哪种 Join、用哪种聚合→ Tungsten 生成即时机器码执行。整个过程你不需要做任何事Spark 全自动完成。AQEAdaptive Query Execution是 Spark 3.0 后加入的运行时优化能在执行过程中根据实际数据量动态调整分区数和 Join 策略相当于边跑边优化。DataFrame 操作分类第二张把所有常用 API 分成五类。前三类是 Transformation懒执行列操作处理列的增删改行过滤减少数据量排序和分区控制数据分布。后两类是有状态操作分组聚合是最常用的统计手段Join 是最贵的操作需要谨慎选择策略。最底部的 Action 才是真正触发计算的操作常见的有show()、count()、collect()、write.parquet()等。记住所有 Transformation 都是懒的只有 Action 才让 DAG 动起来。三种 Join 策略第三张是 SQL 调优里最高价值的知识点。Broadcast Hash Join 是性能最好的把小表默认小于 10MB广播到每个 Executor 的内存大表的每行直接在本地查哈希表匹配完全没有 Shuffle速度极快适合大表 join 维度表/字典表。Sort Merge Join 是默认的兜底策略两张大表都按 Join Key 做 Shuffle 重新分区每个分区内各自排序再双指针归并代价最高但对大数据量最稳定。Shuffle Hash Join 介于两者之间Shuffle 之后 Build 侧构建 Hash 表Probe 侧逐行查不需要排序适合一侧中等大小的场景。实战口诀能 broadcast 就 broadcast不能就开 AQE 让 Spark 自己选。数据读写与 Window 函数第四张是日常开发用得最多的两块。读写 API 的核心是formatoptionmode三件套写出时partitionBy可以按列分目录存储极大提升后续查询的谓词下推效率。文件格式方面列式存储Parquet / ORC是大数据场景的首选Delta Lake 在 Parquet 基础上加了事务日志支持 ACID、Upsert 和 Time Travel是 Lakehouse 架构的基石生产环境优先选 Delta。Window 函数是处理每组内的排名/差值/累计类需求的利器核心是先定义WindowSpec按哪列分区、按哪列排序、窗口范围多大然后把任意聚合或分析函数套在over(w)上原始行数不变但多出一列计算结果比groupBy后再 join 回来的写法简洁十倍也快十倍。
Apache Spark 第五章:Spark SQL 与 DataFrame
先从最核心的 Catalyst 优化器开始——它是 DataFrame 性能远超手写 RDD 的秘密所在。Catalyst 是 DataFrame 性能的核心引擎DataFrame 最常用的操作——把每类 API 的用法和背后的执行逻辑对应起来三种 Join 类型的内部机制对比这是 SQL 调优最核心的知识点Window 函数和数据读写的完整流程Catalyst 优化器第一张是理解为什么 DataFrame 比 RDD 快的关键答案。写同样逻辑的代码DataFrame 版会经过四个阶段的自动变换未解析逻辑计划 → Analyzer 对照 Catalog 验证列名和类型 → Optimizer 应用规则引擎做谓词下推、列裁剪、常量折叠、Join 重排序 → Physical Planner 选择具体执行算法选哪种 Join、用哪种聚合→ Tungsten 生成即时机器码执行。整个过程你不需要做任何事Spark 全自动完成。AQEAdaptive Query Execution是 Spark 3.0 后加入的运行时优化能在执行过程中根据实际数据量动态调整分区数和 Join 策略相当于边跑边优化。DataFrame 操作分类第二张把所有常用 API 分成五类。前三类是 Transformation懒执行列操作处理列的增删改行过滤减少数据量排序和分区控制数据分布。后两类是有状态操作分组聚合是最常用的统计手段Join 是最贵的操作需要谨慎选择策略。最底部的 Action 才是真正触发计算的操作常见的有show()、count()、collect()、write.parquet()等。记住所有 Transformation 都是懒的只有 Action 才让 DAG 动起来。三种 Join 策略第三张是 SQL 调优里最高价值的知识点。Broadcast Hash Join 是性能最好的把小表默认小于 10MB广播到每个 Executor 的内存大表的每行直接在本地查哈希表匹配完全没有 Shuffle速度极快适合大表 join 维度表/字典表。Sort Merge Join 是默认的兜底策略两张大表都按 Join Key 做 Shuffle 重新分区每个分区内各自排序再双指针归并代价最高但对大数据量最稳定。Shuffle Hash Join 介于两者之间Shuffle 之后 Build 侧构建 Hash 表Probe 侧逐行查不需要排序适合一侧中等大小的场景。实战口诀能 broadcast 就 broadcast不能就开 AQE 让 Spark 自己选。数据读写与 Window 函数第四张是日常开发用得最多的两块。读写 API 的核心是formatoptionmode三件套写出时partitionBy可以按列分目录存储极大提升后续查询的谓词下推效率。文件格式方面列式存储Parquet / ORC是大数据场景的首选Delta Lake 在 Parquet 基础上加了事务日志支持 ACID、Upsert 和 Time Travel是 Lakehouse 架构的基石生产环境优先选 Delta。Window 函数是处理每组内的排名/差值/累计类需求的利器核心是先定义WindowSpec按哪列分区、按哪列排序、窗口范围多大然后把任意聚合或分析函数套在over(w)上原始行数不变但多出一列计算结果比groupBy后再 join 回来的写法简洁十倍也快十倍。