核心是通过统一datafilter接口抽象过滤动作,支持动态装配、多态替换与可观测性。各过滤器专注单一职责,运行时按配置组合并行执行,返回结构化结果,保障tb级数据清洗的可维护性与可审计性。

核心在于把“怎么过滤”这个动作抽象成统一接口,让不同清洗逻辑互换不改调用代码——不是为炫技,而是让百万行日志、TB级多模态数据能按需切换策略,比如今天用正则快速去噪,明天加Trie树查敏感词,后天接拼音模糊匹配。
定义清晰的过滤器契约
所有清洗过滤器必须实现同一个接口,比如DataFilter:
- 只暴露一个方法:filter(List
data) ,返回清洗后的数据列表 - 不规定内部用HashMap还是DFA,也不限定是否线程安全——这些由具体实现决定
- 接口里避免静态字段或默认方法存状态,防止类加载冲突或并发污染
- 可选加
supports(String dataType)轻量判断,比如"text"或"image_meta",用于路由前快速筛出匹配的过滤器
按场景写具体过滤器,各司其职
每个类专注一件事,便于测试和替换:
- NullValueFilter:扫描字段空值,按配置填默认值或丢弃整行
- RegexPatternFilter:用预编译正则清理邮箱、手机号等格式噪声
- PrefixTreeFilter:基于Trie构建敏感词/违禁词自动机,单次扫描完成百词匹配
- ImageIntegrityFilter:调用PIL验证图像头+尺寸,损坏文件移入隔离区
- CompositeFilter:组合多个过滤器,支持AND/OR逻辑,比如“去重且日期合法且无敏感词”
运行时动态装配,不硬编码
避免new RegexPatternFilter()这种写死方式,用可配置的方式组装:
- 配置文件指定启用哪些过滤器及顺序,如
filters=NullValueFilter,RegexPatternFilter,PrefixTreeFilter - 启动时扫描带
@CleanStage注解的类,反射实例化(检查无参构造、权限、类型是否AssignableFrom DataFilter) - 对百万级数据,先用哈希索引加速字段校验(如用户ID去重),再交由PLINQ或Java Stream.parallel()并行执行过滤链
- Spring环境下用
@Qualifier("imageCleanChain")注入不同组合Bean,开发/生产环境一键切换
让清洗过程可观察、可回滚
多态不只是换实现,更是为了可控交付:
- 每个过滤器返回
FilterResult<record></record>,含清洗数、丢弃数、异常记录列表 - 组合链中任一环节失败,可选择跳过或中断,并输出上下文快照供排查
- 对关键清洗步骤(如脱敏),保留原始字段副本到
_raw_列,支持审计与还原 - 批量任务完成后生成清洗报告表格:图像有效率98.7%、文本去重率12.3%、敏感词拦截241条……











