Spark 4.3:四项改动重塑数据管线
一笔交易发生时,系统需要找到它之前最近的一次报价;一位客户升级会员后,报表还要知道他上个月属于哪个等级。现实中的数据很少整整齐齐:时间对不上、JSON 层层嵌套、历史状态不断变化,工程师还会用 Python 补上 SQL 不好表达的逻辑。
Apache Spark——把大量数据分散到多台机器上清洗、汇总和处理的引擎——在 4.3 版集中处理了这些麻烦。据 Apache Spark 官方发布页,4.3.0 于 2026 年 10 月 30 日发布,是一次增加新功能与改进的 feature release。最值得看的四项变化是 ASOF JOIN、Python UDF 转译、JSON_TABLE,以及 Auto CDC 对 SCD Type 2 的支持。它们分别处理时间对齐、跨语言执行、JSON 展开和历史版本维护。
不过,四项能力的成熟度并不相同。有些默认关闭,有些仍属实验性,还有些依赖外部 connector。本文的功能范围与限制以 Spark 官方文档和迁移指南为准。
时间不必完全对上
普通 JOIN(表连接)通常要求两边的键精确匹配。ASOF JOIN 则允许“找最近的一条”:例如为每笔成交匹配它发生前最近的报价。这类需求过去往往要写更绕的窗口计算或另行处理,现在可以直接用 SQL 表达。
但它还不是可以随处替换旧逻辑的通用连接。官方文档显示,SQL ASOF JOIN 默认关闭,须开启 spark.sql.join.asofJoin.enabled;目前只支持 INNER 和 LEFT OUTER。流式处理中,也只支持左侧为数据流、右侧为静态表的 micro-batch join——micro-batch 是把连续数据切成一小批一小批处理。
这项功能其实酝酿已久。据 Apache Software Foundation Jira,Li Jin 早在 2018 年便提交提案,后来还提到团队曾用基础实现或 pandas 的 merge_asof 绕行。功能进入 4.3 前,项目又禁止了“右侧为流”的用法,因为系统可能只在当前小批次中寻找最近记录,悄悄给出错误结果。这个限制看似保守,却比返回一个貌似合理的错答案更安全。
Python 代码有机会回到 SQL 引擎
UDF(用户自定义函数)是工程师自己补写的数据处理函数。过去使用 Python UDF 时,数据往往要离开 Spark 的 SQL 执行引擎,交给 Python 处理。若能把函数转译成 Catalyst 表达式——Spark 优化器能够理解的内部表达形式——系统就有机会把它和其余查询一起优化,并减少跨语言执行开销。
Spark 4.3 加入了实验性的 Python UDF 转译器。不过官方配置文档强调,这项能力默认关闭,要求启用 ANSI mode,也不能保证转译前后的语义百分之百相同;初版还不支持 Spark Connect。因此,“Python UDF 编译为 SQL”更适合理解为一次有条件的自动改写,而不是所有 Python 函数都会无损提速。
安全边界也要重新测试。据 Apache Software Foundation Jira,一个检索时仍为 Open 的问题显示:当 UDF 是唯一的 JOIN 条件时,转译可能绕过原本用于阻止意外笛卡尔积的 crossJoin 开关。查询不再报错,却可能执行规模为 的两两匹配。打开优化开关后,原有保护机制未必仍按原样工作。
JSON 终于能按标准拆成表
JSON 常用来承载接口和日志数据,但它包含数组或嵌套对象时,很难直接进入规整的行列表格。官方文档称,Spark 4.3 的 JSON_TABLE 采用 SQL:2016 的标准形式,可把 JSON 文档拆成带类型的行列,也能展开数组、生成序号列和检查路径是否存在。
当前实现仍只支持扁平形式,不支持 NESTED PATH。换句话说,它已经能覆盖一批常见拆表任务,但复杂的多层嵌套结构仍需其他处理方式。
变更流开始自动维护历史
CDC(Change Data Capture,变更数据捕获)会把上游的新增、修改和删除持续传下来。SCD Type 2 则不覆盖旧值,而是保存每个版本及其有效区间,以便回答“客户在当时属于哪个等级”。
Spark Declarative Pipelines 的 Auto CDC 现在可以用变更流维护目标表,并支持保留 SCD Type 2 历史。不过官方文档说明,目标表必须支持相应的行级更新,实际能力取决于所用的 lakehouse connector——连接 Spark 与底层湖仓表的组件。它不是脱离存储系统即可自动工作的万能开关。
边界条件同样值得警惕。据 Apache Software Foundation Jira,相关端到端测试曾发现 schema evolution(表结构演进)问题:目标表扩宽后,字段较少的新 micro-batch 可能因列数或嵌套类型不匹配而反复失败,检索时仍未解决。4.3 已为排序表达式类型或历史跟踪列的变化加入漂移检查,遇到这类变化时要求 full refresh,也就是完整重建。
真正的升级成本在四项功能之外
这四项改动把常见的数据管线任务进一步收进 SQL 和声明式流程:时间匹配更直接,部分 Python 逻辑可能被整体优化,JSON 更容易变成表,历史版本也能由变更流维护。它们的共同方向,是减少工程师手写拼接逻辑。
但 Spark 4.3 不能只按“新增四个功能”来评估。官方迁移指南还列出权限检查、聚合执行策略、哈希结果和部分配置项名称等行为变化。即使团队暂时不用这些新能力,升级也应回归测试既有查询、结果一致性、权限和配置。
局限与未知
- 供稿文章只给出四项功能的概括,没有提供性能数据,无法判断 Python UDF 转译或 Auto CDC 在真实负载下能节省多少时间与资源。
- ASOF JOIN 与 Python UDF 转译默认关闭,后者还是实验性功能;启用前需要验证语义、执行计划及原有安全开关。
- Auto CDC 的可用范围受 lakehouse connector 和表结构演进影响,不能把“支持 SCD Type 2”直接等同于所有存储后端都能无条件使用。