用大模型做 SQL 方言迁移,怎么保证迁移前后结果一致?

第 1213 题 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. 方言差异在哪里
  3. 转换阶段:大模型 + 规则
  4. 验证阶段:结果对比是唯一标准
  5. 组织方式

面试怎么回答

方言差异主要在函数行为、隐式类型转换、NULL 排序和聚合、语法、decimal 精度,很多差异不报错但结果悄悄变了。转换阶段先用 sqlglot 这类解析工具做确定性转换,转不了的再交给大模型,并提供公司整理的方言差异对照表,要求模型标注每一处可能改变语义的地方,复杂 SQL 进入人工评审。验证阶段以结果对比为唯一标准:新旧引擎用同一批数据双跑,对比行数、数值字段汇总、去重计数和空值数,再按主键逐行比对;有差异就定位修正并把经验补进对照表;连续多天覆盖月初月末和大促数据。迁移按依赖分批,记录每个任务的状态,切换后保留旧任务以便回切。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

平台迁移时,几千个 SQL 任务要从一种引擎迁到另一种(比如 Hive SQL 迁到 Spark SQL、自建集群迁到云数仓),函数、语法、隐式类型转换、NULL 处理都有差异。用大模型批量转换效率很高,但怎么证明转换后的结果是对的?这是面试官最关心的。

方言差异在哪里

  • 函数:同名函数行为不同(日期函数的格式、字符串截取的起始位置、除法是否整除);
  • 类型转换:字符串和数字比较、隐式转换规则不同;
  • NULL 处理:排序时 NULL 在前还是在后、聚合时的处理;
  • 语法:分区写入方式、建表语句、窗口函数的细节;
  • 精度:decimal 的精度和舍入方式。

很多差异转换后不报错,但结果悄悄变了。

转换阶段:大模型 + 规则

  1. 先用解析工具:用 SQL 解析和转换工具(比如 sqlglot)做确定性的语法转换,能处理大部分常见的语法差异;
  2. 大模型处理剩余的:工具转不了或者转换后有疑问的部分,交给大模型,并提供公司整理的「方言差异对照表」作为上下文;
  3. 要求标注风险点:让模型对每一处可能改变语义的转换做标注,比如「此处 substr 起始位置不同,已调整」;
  4. 按复杂度分级:简单 SQL 自动处理,复杂的(几百行、多层嵌套、自定义函数)进入人工评审。

验证阶段:结果对比是唯一标准

  1. 双跑:同一批输入数据,新旧引擎各跑一遍;
  2. 对比:
    • 行数;
    • 每个数值字段的 sum、min、max,每个字段的去重计数、空值数;
    • 按主键逐行比对,输出差异明细;
  3. 差异分析:有差异的任务,定位是哪一处转换导致的,修正后重新对比;修复经验补充到对照表里;
  4. 连续多天对比:覆盖不同日期的数据特征(月初、月末、大促)。

组织方式

  • 按依赖关系分批迁移,先上游后下游;
  • 每个任务记录状态:已转换、已双跑、对比通过、已切换;
  • 切换后保留旧任务一段时间,可以回切。