脏数据处理办法

在数据库数据录入过程中,可能因为录入方式不一致、拼写差异、空值等问题产生脏数据,这可能会影响相关字段的问答和数据分析。

脏数据示例

以产品表的 brand(品牌)字段为例,同一个真实品牌可能因为录入方式不同产生以下脏数据:

原始值
诺星科技
诺星科技有限公司
诺星
诺星 科技
诺星科技 
NuoXing
NUOXING
诺星科技(深圳)
null
未知

这些值实际指向同一个品牌,但形式各异——简称/全称混用、中英文混用、大小写不一致、多余空格、空值等,需要清洗统一。

解决方案

方案一:SQL 清洗

接入数据表时,可以在 Schema 配置的 SQL 中直接编写清洗规则,将整段 SQL 作为模型的数据集。这种方式在数据接入层统一处理,后续所有基于该 Schema 的问答都会使用清洗后的结果。

CASE WHEN 进行清洗:

SELECT
    CASE
        WHEN brand IS NULL OR TRIM(brand) IN ('', '未知', 'null') THEN '其他'
        WHEN LOWER(TRIM(brand)) IN ('nuoxing', '诺星', '诺星科技有限公司') THEN '诺星科技'
        ELSE TRIM(brand)
    END AS brand,
    ...
FROM product_table

方案二:字段映射

针对偶发的脏数据问题,可以在单个字段上编写临时清洗逻辑,跳过原表数据的直接使用。

配置入口: 系统搭建 → 业务建模 → Schema 管理,找到目标 Schema 的具体字段,点击编辑,在 高级 下方的 字段映射 框中,即可用所选数据源的语法编写清洗表达式。

以 ClickHouse 的 multiIf 语法为例:

multiIf(
    brand IS NULL OR trimBoth(brand) IN ('', '未知', 'null'), '其他',
    lowerUTF8(trimBoth(brand)) IN ('nuoxing', '诺星', '诺星科技有限公司'), '诺星科技',
    trimBoth(brand)
)

清洗效果

两种方案的清洗结果一致:

原始 brand清洗后
NULL其他
''其他
' '其他
'未知'其他
'null'其他
'诺星'诺星科技
'诺星科技有限公司'诺星科技
'nuoxing'诺星科技
'NUOXING'诺星科技
' NuoXing '诺星科技
'诺星科技 '诺星科技
'维拓数码 '维拓数码

清洗逻辑将 brand 分为三类:

  1. 空值/无效值(NULL、空字符串、未知、null)→ 归为 其他
  2. 同一品牌的多种写法(大小写、简称、全称、带空格)→ 统一为 诺星科技
  3. 其余正常值 → 保留原始值并去除首尾空格

方案对比

SQL 清洗字段映射
作用层级数据接入层,全局生效字段级,按需配置
适用场景规则稳定、长期使用的清洗逻辑偶发脏数据、临时修补
灵活性需修改 Schema SQL随时编辑、即时生效

注意事项

字段映射本质上是用于处理特殊业务逻辑的配置(如字段值转换、分类归并等),并非专门为清洗脏数据而设计。上文示例仅展示了借助该能力间接处理脏数据的一种做法,适用范围有限。

如果脏数据过多,大量依赖字段映射来清洗会显著增加实施成本和维护负担,偏离该配置的设计初衷。建议企业在接入系统前,优先从源头保证数据质量。优质的数据,方能更好地发挥 DataAgent 的能力。