SAS 迁移至 Databricks ― 加速器

Table of Contents
SAS → Databricks 迁移加速器
― 对金融机构来说,难的不是改写代码,而是证明“结果没有变”
本指南涵盖
- 两条路线:全部改写为 PySpark,或保留 SAS Viya 并把计算下推到 Databricks
- SAS 代码资产的分类方法
- DATA 步、PROC、宏的转换模式
- 最容易导致结果偏差的五个差异点
- 对账与模型验证所需的证据
- 联系邮箱:Admin@innovationalofficesolution.com
一、为什么越来越多团队开始迁移 SAS
在国内银行、保险和消费金融机构中,SAS 长期承担着评分卡开发、风险计量、监管报送数据准备和客户分析等核心工作。它稳定、可审计,也积累了大量经过验证的代码。
推动迁移的通常不是单一原因,而是几个因素叠加:
- 人才结构:新入职的数据工程师和建模人员普遍以 Python、SQL 和 Spark 为主要技能,SAS 代码的维护越来越依赖少数资深人员
- 数据位置:业务数据已经汇入湖仓,为了用 SAS 分析,还要再导出一份到 SAS 服务器
- 算力弹性:月末、季末的集中计算需要按峰值配置 SAS 服务器,平时资源闲置
- AI 衔接:机器学习和大模型应用更自然地构建在 Python 生态之上
二、先选路线:改写,还是下推
| 路线 | 适用情况 | 说明 |
|---|---|---|
| A. 全部改写为 PySpark / Spark SQL | 以数据准备、加工、报表为主的 SAS 代码 | 彻底摆脱 SAS 运行时,代码由 Python / SQL 团队维护 |
| B. 保留 SAS Viya,计算下推到 Databricks | 短期内无法替换的统计过程、已通过验证的监管模型 | SAS Viya 可通过访问引擎连接 Databricks,把转换步骤翻译为 SQL 在 Databricks 内执行,减少数据搬移 |
| C. 混合 | 大多数金融机构的现实选择 | 数据加工全部迁到 Databricks;少量核心模型分阶段评估 |
需要说明的是,Databricks 的免费迁移工具 Lakebridge 目前的官方转换指南中没有列出 SAS,因此 SAS 代码的转换需要专门的解析与转换能力,这正是本加速器提供的部分。
三、代码资产分类
在开始转换之前,先按用途把 SAS 程序分为四类:
- 数据准备与加工:DATA 步、PROC SQL、PROC SORT、MERGE —— 优先改写
- 汇总与报表:PROC MEANS / SUMMARY / FREQ / TABULATE / REPORT —— 改写为 SQL 与仪表板
- 统计建模:PROC LOGISTIC、PROC REG、PROC GLM 等 —— 逐个评估,涉及已投产监管模型的,需要模型验证团队参与
- 调度与外壳:%INCLUDE 链、LIBNAME、批处理脚本 —— 转换为作业编排与 Unity Catalog 配置
四、转换模式
| SAS | Databricks |
|---|---|
| DATA 步(SET / WHERE / IF) | DataFrame filter / withColumn |
| BY 组处理 FIRST. / LAST. | 窗口函数 row_number / 标记首末行 |
| RETAIN、累计求和 | 窗口函数 sum().over() |
| LAG / DIF | lag() 窗口函数 |
| ARRAY + DO 循环 | 列表推导生成多列 / stack / explode |
| MERGE(BY) | join(注意多对多行为差异)/ Delta MERGE |
| PROC SQL | Spark SQL |
| PROC SORT NODUPKEY | dropDuplicates |
| PROC MEANS / SUMMARY | groupBy().agg() |
| PROC FREQ | groupBy().count() / crosstab |
| PROC TRANSPOSE | pivot / unpivot |
| PROC FORMAT | 映射 Delta 表 + join |
| 宏(%MACRO / %LET / %DO / CALL SYMPUT) | Python 函数、参数化 Notebook、作业参数 |
| SAS 数据集(.sas7bdat) | Delta 表 |
| LIBNAME | Unity Catalog 目录与 Schema |
转换引擎会先展开宏,确认宏实际生成的代码,再进行翻译;初始自动转换准确率为 70%~90%。
五、五个最容易导致结果偏差的差异点
① 缺失值
SAS 中数值缺失值在比较时被视为最小值,例如 `if x < 0` 对缺失值成立;Spark 中 NULL 参与比较结果为 NULL,记录会被过滤掉。风控规则中大量使用阈值判断,这是最需要逐条核对的地方。
② MERGE 与 JOIN
SAS 的 MERGE 在多对多情况下并不产生笛卡尔积,而 SQL 的 JOIN 会。迁移前需要确认关联键的唯一性。
③ 隐式排序
SAS 的 BY 处理依赖数据已排序,很多逻辑默认“按顺序取第一条”。Spark 是分布式处理,不保证顺序,必须显式指定排序规则。
④ 中文编码
历史 SAS 数据集常以 EUC-CN / GB2312 或 GBK 编码保存,程序中可能用字节长度截取中文字符串。迁移到 UTF-8 后,一个汉字的字节数发生变化,SUBSTR 等函数的结果会不同,需按字符重写。
⑤ 数值精度与日期
SAS 日期以 1960 年 1 月 1 日为起点存储为数值,导入时需正确转换;涉及金额的计算需显式指定 DECIMAL 精度,避免浮点误差。
六、对账与证据
金融机构的迁移通常需要向模型验证、内审甚至监管说明“结果一致”。PulseQA 为每个程序生成:
- 行数、主键差异和列级合计的比对结果
- 缺失值 / NULL 数量对比
- 关键变量的分布对比(均值、分位数)
- 评分类程序的分数分布对比与逐条差异清单
建议保存为可追溯的迁移证据包。
七、合规提示
客户数据通常属于个人信息,部分机构还属于关键信息基础设施运营者。根据《促进和规范数据跨境流动规定》,关键信息基础设施运营者向境外提供个人信息或重要数据需要申报数据出境安全评估。因此,金融机构的 Databricks 环境应优先部署在境内区域(例如由世纪互联运营的 Azure 中国区),并在 Unity Catalog 中对身份证号、手机号等敏感字段配置列掩码。
八、应用示例:Emulus Consulting
Emulus Consulting 使用本加速器梳理了 160 个 SAS 程序和 85 个宏,将数据加工类代码全部迁移至 Databricks。
- 迁移周期:9 周
- 月末批处理:7 小时 → 35 分钟
- SAS 服务器与许可成本降低 50%
- 对账差异:全部关闭并经业务确认
用你最复杂的 5 个程序来验证
提交 5 个包含宏和 BY 组处理的 SAS 程序,我们免费提供 PySpark 代码与对账报告。
- 免费 POC:免费 POC(Pulse Convert)
- 官网:innovationalofficesolution.com
- 邮箱:Admin@innovationalofficesolution.com
将 SAS 统计与风控代码安全迁移至 Databricks
DATA 步、PROC SQL 与复杂宏代码转为云原生 PySpark。解决缺失值、隐式排序与中文编码差异,提供审计级的精度对账证据包。初始自动转换准确率 70%~90%。