用大模型做 SQL 方言迁移,怎么保证迁移前后结果一致?
面试怎么回答
方言差异主要在函数行为、隐式类型转换、NULL 排序和聚合、语法、decimal 精度,很多差异不报错但结果悄悄变了。转换阶段先用 sqlglot 这类解析工具做确定性转换,转不了的再交给大模型,并提供公司整理的方言差异对照表,要求模型标注每一处可能改变语义的地方,复杂 SQL 进入人工评审。验证阶段以结果对比为唯一标准:新旧引擎用同一批数据双跑,对比行数、数值字段汇总、去重计数和空值数,再按主键逐行比对;有差异就定位修正并把经验补进对照表;连续多天覆盖月初月末和大促数据。迁移按依赖分批,记录每个任务的状态,切换后保留旧任务以便回切。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
平台迁移时,几千个 SQL 任务要从一种引擎迁到另一种(比如 Hive SQL 迁到 Spark SQL、自建集群迁到云数仓),函数、语法、隐式类型转换、NULL 处理都有差异。用大模型批量转换效率很高,但怎么证明转换后的结果是对的?这是面试官最关心的。
方言差异在哪里
- 函数:同名函数行为不同(日期函数的格式、字符串截取的起始位置、除法是否整除);
- 类型转换:字符串和数字比较、隐式转换规则不同;
- NULL 处理:排序时 NULL 在前还是在后、聚合时的处理;
- 语法:分区写入方式、建表语句、窗口函数的细节;
- 精度:decimal 的精度和舍入方式。
很多差异转换后不报错,但结果悄悄变了。
转换阶段:大模型 + 规则
- 先用解析工具:用 SQL 解析和转换工具(比如 sqlglot)做确定性的语法转换,能处理大部分常见的语法差异;
- 大模型处理剩余的:工具转不了或者转换后有疑问的部分,交给大模型,并提供公司整理的「方言差异对照表」作为上下文;
- 要求标注风险点:让模型对每一处可能改变语义的转换做标注,比如「此处 substr 起始位置不同,已调整」;
- 按复杂度分级:简单 SQL 自动处理,复杂的(几百行、多层嵌套、自定义函数)进入人工评审。
验证阶段:结果对比是唯一标准
- 双跑:同一批输入数据,新旧引擎各跑一遍;
- 对比:
- 行数;
- 每个数值字段的 sum、min、max,每个字段的去重计数、空值数;
- 按主键逐行比对,输出差异明细;
- 差异分析:有差异的任务,定位是哪一处转换导致的,修正后重新对比;修复经验补充到对照表里;
- 连续多天对比:覆盖不同日期的数据特征(月初、月末、大促)。
组织方式
- 按依赖关系分批迁移,先上游后下游;
- 每个任务记录状态:已转换、已双跑、对比通过、已切换;
- 切换后保留旧任务一段时间,可以回切。