4、数据源接入与清洗:常见数据源、清洗策略与质量校验

数据源接入,说白了就是让看板能「吃」到数据。这一步要是没做好,后面所有图表都是空中楼阁。我见过太多团队,花了两周搭了个漂亮的看板,结果数据一刷新全是乱码——嗯,源头就没管好。

这一章,我们聊聊怎么把数据从各个地方接进来,怎么洗,怎么验。都是实战里踩过的坑,我尽量说透。

4.1 常见数据源接入方式

治理看板的数据源,无非三大类:关系型数据库、大数据平台、HTTP API。每种接入方式,都有它的脾气。

4.1.1 MySQL 接入

MySQL 是最常见的 OLTP 数据源。我个人习惯用 JDBC 直连,但要注意几个点:

  • 连接池配置:别每次查询都新建连接,用 HikariCP 或 Druid 管理
  • 只读权限:看板查询一律用只读账号,防止误写
  • 超时控制:设置查询超时,避免慢 SQL 拖垮看板
小技巧:MySQL 查询尽量走索引。我在项目中遇到过,一个没加索引的千万级表,看板加载花了 40 秒——后来加了个联合索引,降到 0.3 秒。
-- 示例:创建只读用户
CREATE USER 'dashboard_ro'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT ON dashboard_db.* TO 'dashboard_ro'@'%';
FLUSH PRIVILEGES;

4.1.2 Hive 接入

Hive 适合离线大宽表。接入时,我建议用 JDBC + 异步查询 的方式。为什么?因为 Hive 查询慢,同步等的话,看板会卡死。

  • 分区裁剪:查询时指定分区字段,避免全表扫描
  • 结果缓存:对 T+1 的数据,缓存查询结果,减少重复计算
  • 连接数限制:HiveServer2 并发有限,别开太多连接
注意:Hive 的 JDBC 驱动版本要和集群版本匹配。我曾经因为驱动版本不一致,查出来的日期字段全是 null——排查了一整天。

4.1.3 API 接入

API 接入最灵活,但也最「脏」。常见的有 RESTful 接口、GraphQL、甚至古老的 SOAP。

我总结了一套 API 接入的「三板斧」:

  1. 重试机制:网络抖动是常态,指数退避重试 3 次
  2. 限流保护:别把对方接口打挂了,用令牌桶控制速率
  3. 数据校验:接口返回的字段可能为空、类型不对、甚至缺失
// 伪代码:API 接入模板
function fetchApiData(url, params) {
  const retryCount = 3;
  for (let i = 0; i < retryCount; i++) {
    try {
      const response = await axios.get(url, { params, timeout: 5000 });
      // 校验返回结构
      if (!response.data || !response.data.data) {
        throw new Error('数据格式异常');
      }
      return response.data.data;
    } catch (error) {
      if (i === retryCount - 1) throw error;
      await sleep(Math.pow(2, i) * 1000); // 指数退避
    }
  }
}

4.2 数据清洗策略

数据接进来了,但往往是「脏」的。空值、重复、格式不一致……不清洗,看板就是垃圾进垃圾出。

4.2.1 常见脏数据类型

脏数据类型 典型表现 影响
空值/缺失 NULL、空字符串、'N/A' 聚合计算错误、图表断点
重复数据 完全重复的行、业务主键重复 计数翻倍、趋势失真
格式不一致 日期格式混用、金额单位不统一 排序异常、对比无效
异常值 负数金额、未来日期、超长文本 统计指标被拉偏
逻辑矛盾 下单时间晚于发货时间 业务规则被破坏

4.2.2 清洗策略

清洗不是一刀切。我一般按这个优先级处理:

  • 丢弃:对分析无意义的脏数据,直接过滤掉(比如全为空的记录)
  • 填充:数值型用均值/中位数填充,类别型用众数或「未知」
  • 转换:统一格式,比如日期全部转成 yyyy-MM-dd
  • 标记:对可疑数据打标签,保留原始值,供后续人工核查
核心原则:清洗逻辑必须可追溯。每次清洗都记录原始值、清洗规则、清洗时间。这样出了问题,能快速定位是清洗规则的问题,还是源头数据的问题。
-- 示例:清洗 SQL(MySQL)
-- 1. 去重
DELETE FROM raw_sales
WHERE id NOT IN (
  SELECT MIN(id) FROM raw_sales GROUP BY order_id, product_id
);

-- 2. 填充空值
UPDATE raw_sales
SET amount = COALESCE(amount, 0)
WHERE amount IS NULL;

-- 3. 标记异常值
UPDATE raw_sales
SET data_quality_flag = '异常-金额为负'
WHERE amount < 0;

4.3 数据质量校验规则

清洗完了,怎么知道数据「能用」?得定规则、做校验。我把它分成三个层次。

4.3.1 完整性校验

检查数据有没有缺胳膊少腿。常用的规则:

  • 非空检查:关键字段(如订单ID、时间戳)不能为空
  • 记录数检查:今天的数据量不能比昨天少太多(比如少于 80% 就报警)
  • 字段覆盖率:每个字段的非空比例要达标

4.3.2 准确性校验

数据对不对,得跟「标准答案」比对。

  • 值域检查:年龄在 0-120 之间,金额大于 0
  • 格式校验:手机号 11 位,邮箱包含 @
  • 业务规则校验:下单时间 ≤ 发货时间 ≤ 签收时间

4.3.3 一致性校验

不同数据源之间,数据得对得上。

  • 汇总对比:MySQL 里的订单总数,和 Hive 里的汇总数一致
  • 关联校验:订单表的用户 ID,在用户表里都能找到
  • 趋势校验:环比波动超过 50% 时,触发人工核查
实战经验:我建议把校验规则做成配置化的。用一张规则表,定义好「字段、规则类型、阈值、报警级别」。这样新增规则不用改代码,运营同学自己就能配。

4.4 数据接入与清洗的整体流程

下面这张图,是我做数据接入时的标准流程。从源头到看板,每一步都有校验,每一步都有记录。

数据接入与清洗流程 数据源 MySQL / Hive / API 数据接入 JDBC / HTTP / 异步 数据清洗 去重 / 填充 / 转换 异常标记 质量校验 完整性 / 准确性 一致性 清洗后数据表 校验规则库 非空检查 值域检查 格式校验 业务规则校验 汇总对比校验 报警与日志 钉钉/邮件报警 清洗日志记录 校验结果明细 💡 核心:清洗与校验规则可配置、可追溯 每次接入都记录原始数据量、清洗量、异常量,形成数据质量报告

4.5 实战中的几个坑

最后,分享几个我踩过的坑,希望能帮你省点时间。

  • 坑一:API 接口突然改字段名。我曾经对接一个第三方数据源,对方悄无声息地把 user_name 改成了 username,看板直接崩了。后来我加了字段映射表和接口 schema 校验,变了就报警。
  • 坑二:时区问题。MySQL 存的是 UTC,Hive 存的是东八区,API 返回的是时间戳。不统一时区,看板上的时间线全是乱的。我的做法是:所有数据接入时统一转成 UTC,展示时再转本地时区。
  • 坑三:清洗规则「过洗」。有次我写了个清洗规则,把金额为 0 的订单全删了。结果业务方说「0 元订单是活动单,要保留的」——嗯,从那以后,清洗规则上线前我都会拉业务方确认一遍。
总结一句话:数据接入不是「接进来就行」,而是「接进来、洗干净、验通过、可追溯」。每一步都做到位,看板的数据质量才有保障。