3. Spark SQL 基础回顾:DataFrame 与 Dataset 概念、Spark SQL 执行流程、Catalyst 优化器简介

在金融特征缺失巡检场景中,Spark SQL 是处理海量表级与行级数据缺失的核心引擎。理解其基础概念与执行机制,是后续编写高效巡检脚本的前提。本节将围绕 DataFrame 与 Dataset 的异同、Spark SQL 的完整执行链路以及 Catalyst 优化器的核心作用展开。

3.1 DataFrame 与 Dataset 概念对比

DataFrame 与 Dataset 是 Spark SQL 的两大核心抽象,在 Spark 2.0 之后趋于统一。DataFrame 是 弱类型 的 Dataset[Row],而 Dataset 是 强类型 的分布式数据集。在金融特征巡检中,DataFrame 因其灵活性和 SQL 兼容性使用更广。

对比维度 DataFrame Dataset
类型安全 编译期不检查列类型,运行时报错 编译期检查类型,适合复杂业务逻辑
API 风格 支持 SQL 查询与 DSL 操作 主要使用强类型 Scala/Java 对象操作
序列化方式 使用 Spark 内部 Row 格式,性能高 使用 Java/Kryo 序列化,有一定开销
适用场景 数据探索、ETL、SQL 巡检脚本 需要类型约束的复杂转换管道
Python 支持 原生支持 PySpark 仅支持 Scala/Java
巡检实践提示: 在金融特征缺失巡检中,推荐优先使用 DataFrame + SQL 方式。因为巡检逻辑通常涉及大量聚合、关联和条件判断,SQL 表达更简洁,且 DataFrame 的 Catalyst 优化更充分。

3.2 Spark SQL 执行流程

一条 Spark SQL 查询从提交到结果返回,经历 解析 → 绑定 → 优化 → 物理计划 → 执行 五个阶段。理解这个流程有助于定位巡检脚本的性能瓶颈。

  1. SQL 解析(Parse):将 SQL 文本解析为未绑定的逻辑计划(Unresolved Logical Plan),此时表名、列名尚未校验。
  2. 逻辑计划绑定(Analyze):通过 Catalog 元数据将表名、列名绑定到具体字段,生成已解析的逻辑计划(Analyzed Logical Plan)。
  3. 逻辑优化(Optimize):Catalyst 优化器应用规则(谓词下推、列剪枝、常量折叠等)生成优化后的逻辑计划(Optimized Logical Plan)。
  4. 物理计划生成(Physical Planning):将逻辑计划转换为一个或多个物理执行策略(Physical Plan),并选择成本最低的策略。
  5. 代码生成与执行(Codegen & Execution):生成 Java 字节码(WholeStageCodegen),在 Spark 集群上分布式执行。
关键理解: 在特征缺失巡检中,谓词下推 和 列剪枝 是最重要的两个优化。谓词下推让过滤条件尽早作用于数据源,减少扫描量;列剪枝只读取巡检所需的特征列,避免全表列扫描。
Spark SQL 执行流程 Spark SQL 执行流程(五阶段) SQL 解析 逻辑绑定 Catalyst 优化 物理计划 代码生成 & 执行 说明:Catalyst 优化器是 Spark SQL 性能的核心,负责谓词下推、列剪枝、常量折叠等规则 Unresolved Logical Plan Analyzed Logical Plan Optimized Logical Plan Physical Plan RDD / 字节码

3.3 Catalyst 优化器简介

Catalyst 是 Spark SQL 的查询优化框架,基于 树形结构 和 规则引擎 实现。它将逻辑计划表示为树节点,通过不断匹配规则进行变换,最终生成高效的物理计划。

3.3.1 核心优化规则

优化规则 作用说明 巡检场景收益
谓词下推 将 WHERE 过滤条件提前到数据源读取时执行 减少扫描分区数,加速缺失值过滤
列剪枝 只读取查询中实际用到的列 避免读取无关特征列,降低 I/O
常量折叠 编译期计算常量表达式 减少运行时计算开销
Join 重排序 将小表优先广播或调整 Join 顺序 优化多表关联巡检的性能
投影合并 合并相邻的投影操作 减少中间数据传递次数
注意: Catalyst 优化器对 SQL 写法敏感。例如,在子查询中使用 SELECT * 会阻止列剪枝;在 WHERE 条件中对列使用函数(如 WHERE CAST(col AS STRING) = '0')可能阻止谓词下推。编写巡检 SQL 时应尽量保持列原始类型。

3.3.2 Catalyst 优化器架构

Catalyst 内部采用 规则 + 策略 的架构。规则(Rule)对逻辑计划树进行等价变换;策略(Strategy)将逻辑计划转换为物理计划。整个优化过程是 迭代 的,直到树不再变化为止。

Catalyst 优化器架构 Catalyst 优化器架构 Analyzed Plan 规则引擎 谓词下推 / 列剪枝 / 常量折叠 策略选择 成本估算 / 物理算子 Physical Plan 迭代直到树不再变化(Fixpoint) 说明:Catalyst 优化器通过规则引擎反复重写逻辑计划,再通过策略选择最优物理执行方案

3.4 在巡检中如何利用 Spark SQL 执行流程

理解执行流程后,在编写特征缺失巡检脚本时可以主动配合优化器:

  • 尽早过滤:在 SQL 中先写 WHERE 条件过滤无效分区或非目标特征,让谓词下推生效。
  • 只选必需列:使用 SELECT col1, col2, ... 而非 SELECT *,配合列剪枝减少 I/O。
  • 避免复杂表达式:在 WHERE 和 JOIN 条件中尽量使用原始列,避免函数包裹导致优化失效。
  • 善用 EXPLAIN:使用 df.explain(true) 查看物理计划,确认谓词下推和列剪枝是否生效。
示例: 查看物理计划确认优化效果
# 在 PySpark 中查看执行计划
df = spark.sql("SELECT feature_1, feature_2 FROM feature_table WHERE dt = '2024-01-01'")
df.explain(True)  # 输出解析、优化、物理计划全链路