1. 项目概述
在数据科学项目中,数据预处理环节往往占据了70%以上的工作时间。作为一名长期使用Dataiku DSS的数据工程师,我发现很多新手在构建数据处理流程时,常常陷入"receipes套receipes"的困境——为了完成一个简单的过滤或计算操作,不得不在流程中插入多个独立的receipes节点,导致项目流看起来像意大利面条一样杂乱。这正是Dataiku设计预过滤(Pre-filter)、后过滤(Post-filter)和计算列(Computed columns)这三个通用步骤的初衷。
2. 核心功能解析
2.1 预过滤(Pre-Filter)的深度应用
预过滤的本质是在当前receipes执行前对输入数据集进行条件筛选。与独立的"采样/过滤"receipes相比,内置的预过滤有三大优势:
- 性能优化:过滤操作在内存中完成,避免了中间数据集的物理写入
- 流程简化:减少项目流中的节点数量,提升可读性
- 上下文保留:过滤条件与receipes逻辑保持在同一配置界面
典型应用场景:
- 在关联(Join)操作前排除空值记录
- 在分组(Group)前筛选特定时间范围的数据
- 在窗口(Window)计算前限制数据量级
技术细节:预过滤使用Dataiku自研的过滤引擎,支持以下表达式类型:
- 简单条件:
column_A > 100- 复合条件:
(column_A LIKE '%test%') AND (column_B BETWEEN 10 AND 20)- 函数表达式:
LEN(column_C) < 5
2.2 后过滤(Post-Filter)的巧妙之处
后过滤的特殊性在于它作用于receipes输出结果而非输入数据。这在以下场景中不可替代:
-
基于聚合结果的筛选:
sql复制-- 只保留分组后平均金额大于100的记录 WHERE avg_amount > 100 -
去除中间结果中的异常值:
sql复制-- 在窗口计算后排除3σ以外的数据 WHERE value BETWEEN (mean - 3*std) AND (mean + 3*std) -
结果集去重:
sql复制-- 对Join后的结果按指定列去重 DISTINCT ON (user_id, date)
性能提示:当需要对同一数据集应用多个过滤条件时,组合使用预过滤和后过滤可以显著降低内存消耗。例如先用预过滤缩小数据规模,再通过后过滤进行精细筛选。
2.3 计算列(Computed Columns)的高阶技巧
计算列功能将常见的列变换操作直接嵌入到各个receipes中,支持两种表达式语言:
1. Dataiku公式语言:
- 优势:内置200+函数,支持自动补全和实时校验
- 示例:将交易金额分段
code复制IF(amount < 100, "小额", IF(amount < 1000, "中额", "大额"))
2. SQL表达式:
- 优势:支持复杂子查询和窗口函数
- 示例:计算累计占比
sql复制amount / SUM(amount) OVER (PARTITION BY category)
实战经验:
- 对于简单转换优先使用公式语言,执行效率更高
- 涉及多表关联或窗口计算时切换到SQL模式
- 创建的计算列会自动加入下游receipes的元数据系统
3. 实战案例:信用卡交易分析
3.1 数据准备流程优化
传统方式:
- 采样/过滤receipes → 2. 准备receipes(公式) → 3. 分组receipes → 4. 过滤receipes
优化后流程:
- 分组receipes(集成预过滤+计算列+后过滤)
具体配置:
- 预过滤:
province IN ('上海','北京','广州') - 计算列:
sql复制CASE WHEN amount < 500 THEN '低风险' WHEN amount < 5000 THEN '中风险' ELSE '高风险' END AS risk_level - 后过滤:
avg_amount > 100 AND COUNT(*) >= 5
3.2 性能对比测试
| 指标 | 传统方式 | 集成方式 | 提升幅度 |
|---|---|---|---|
| 执行时间(s) | 28.7 | 19.2 | 33% |
| 内存占用(MB) | 1240 | 890 | 28% |
| 节点数量 | 4 | 1 | 75% |
4. 常见问题排查
4.1 预过滤失效分析
现象:设置的过滤条件未生效
排查步骤:
- 检查条件语法是否正确(注意日期格式等特殊类型)
- 确认未与其他receipes的过滤条件冲突
- 查看数据统计中的值分布是否匹配预期
4.2 计算列报错处理
典型错误:
Column not found:检查上游receipes是否删除了依赖列Type mismatch:确认表达式返回值类型与定义一致Timeout:复杂SQL建议拆分为多个计算列
4.3 性能优化建议
- 对数值型过滤条件建立分区索引
- 避免在计算列中使用正则表达式等昂贵操作
- 大数据集考虑先采样再应用复杂变换
5. 最佳实践总结
经过多个金融风控项目的验证,我总结出以下经验:
-
分层过滤策略:
- 预过滤:基于原始数据的硬性条件(如时间范围)
- 后过滤:基于业务逻辑的软性规则(如异常阈值)
-
计算列命名规范:
- 前缀标识计算方式:
calc_,agg_,derived_ - 后缀注明数据类型:
_dt,_amt,_flag
- 前缀标识计算方式:
-
流程设计原则:
- 单个receipes内完成一个完整的数据变换
- 通过注释块记录每个过滤/计算条件的业务含义
- 对复杂条件保存为可复用的代码片段