数据采集与预处理:数据源类型与清洗标准化

大家好,我是老张。今天咱们聊聊数据采集与预处理。说实话,这活儿看着不起眼,但在我十几年的数据工程生涯里,80% 的线上事故都出在这一步。你想想看,数据源没搞对,后面分析得再漂亮也是白搭。

核心观点:数据采集是地基,预处理是钢筋。地基歪了,楼盖得再高也得塌。

一、数据源类型:三种常见的数据来源

数据源千千万,但咱们做回放分析,最常打交道的就三种。我一个个说。

1. 传感器日志

传感器日志,说白了就是设备上报的「流水账」。温度、湿度、转速、GPS 坐标……每一条记录都带着时间戳。

特点:

  • 高频写入:每秒可能上千条,甚至上万条
  • 格式松散:不同厂商的传感器,字段名都不一样
  • 噪声多:信号干扰、设备重启,都会产生脏数据

我在项目中遇到过一件事。某次做车联网回放,发现某辆车的 GPS 坐标突然跳到了太平洋中间。后来排查发现,是传感器在隧道里丢了信号,恢复后直接报了默认值。嗯,这种坑踩过一次就记住了。

2. 数据库 binlog

binlog 是 MySQL 的二进制日志,记录着所有数据变更。做数据回放时,binlog 是「时光机」—— 你可以把数据库恢复到任意一秒的状态。

为什么用它?

  • 完整还原:INSERT、UPDATE、DELETE 全都有
  • 低侵入性:不需要改业务代码,直接监听日志就行
  • 实时性高:延迟通常在毫秒级

我的习惯:采集 binlog 时,一定要记录 GTID(全局事务标识符)。否则遇到主从切换,你都不知道数据断在了哪里。

3. 网络抓包

网络抓包,就是监听网卡上的数据包。HTTP 请求、RPC 调用、消息队列的推送……全都能抓到。

适用场景:

  • 排查接口超时问题
  • 分析用户行为路径
  • 验证协议兼容性

我曾经用 tcpdump 抓过一个诡异的问题:某服务每隔 30 秒就超时一次,查了三天没找到原因。最后抓包发现,是运维的监控脚本每 30 秒发了一个探测包,把连接池占满了。你想想看,这种问题不看原始包,根本想不到。

二、数据清洗:去重与异常值处理

数据采回来了,但别急着用。先洗一洗。我见过太多人,数据没洗就直接跑分析,结果结论全是错的。

1. 去重

重复数据怎么来的?

  • 网络重传:TCP 重试导致同一数据包被收了两次
  • 消费端重复消费:Kafka 消费者重启后,可能重复拉取
  • 业务逻辑 bug:代码里没做幂等,同一个订单生成了两条记录

去重策略:

方法 适用场景 缺点
基于主键去重 数据库 binlog 需要业务主键唯一
基于时间戳+ID 去重 传感器日志 时间戳精度不够会误删
布隆过滤器 高吞吐场景 有误判率,不能 100% 准确

注意:去重不是无脑删。我曾经因为去重策略太激进,把用户正常的多笔交易记录当成重复数据删了。后来加了个「疑似重复」标记,人工审核后才处理。

2. 异常值处理

异常值分两种:一种是「明显错误」,比如温度传感器报了 -999℃;另一种是「统计异常」,比如某个用户的访问量突然暴涨 100 倍。

处理方法:

  1. 阈值过滤:设定合理范围,超出就丢弃或标记
  2. 3σ 原则:超过均值 ±3 个标准差的,视为异常
  3. 箱线图法:用四分位数判断,适合非正态分布的数据

我个人习惯用箱线图。为什么?因为真实数据往往不是正态分布。你想想看,用户活跃度、系统响应时间,这些数据天生就是偏态的。用 3σ 会误杀太多正常值。

三、数据格式化与标准化

数据洗完了,但格式还不统一。比如时间戳,有的用 Unix 毫秒,有的用 ISO 8601 字符串。不统一的话,后面分析根本没法做。

1. 格式化

格式化就是把数据转成统一的「模样」。

常见操作:

  • 时间戳统一为 UTC 毫秒
  • IP 地址统一为整数或标准字符串
  • JSON 字段统一 key 的命名风格(驼峰或下划线)
# 举个例子:时间戳格式化
原始数据:2024-03-15T10:30:00.123Z
格式化后:1710484200123(Unix 毫秒)

# 代码示例(Python)
import datetime

def format_timestamp(ts_str):
    dt = datetime.datetime.fromisoformat(ts_str.replace('Z', '+00:00'))
    return int(dt.timestamp() * 1000)

2. 标准化

标准化比格式化更进一步。它解决的是「量纲不同」的问题。

比如,A 传感器的温度单位是摄氏度,B 传感器是华氏度。不标准化的话,你算出来的平均值毫无意义。

标准化方法:

方法 公式 适用场景
Min-Max 归一化 (x - min) / (max - min) 数据范围已知,且无极端值
Z-score 标准化 (x - μ) / σ 数据近似正态分布
单位向量化 x / ||x|| 文本或特征向量

避坑指南:我曾经在标准化时,把训练集的 min 和 max 直接用到测试集上。结果测试集里出现了比训练集更大的值,归一化后直接超过了 1。后来我改成「在线标准化」,每次只基于历史窗口计算统计量。

四、知识体系总览

下面这张图,是我自己总结的数据采集与预处理的核心逻辑。你一看就明白了。

数据采集与预处理核心流程 数据源层 传感器日志 数据库 binlog 网络抓包 数据清洗层 去重(主键/时间戳/布隆) 异常值处理(阈值/3σ/箱线图) 格式化与标准化层 格式化(时间/IP/JSON 统一) 标准化(Min-Max/Z-score/向量化) 输出:高质量回放数据

这张图从左到右,从上到下,就是数据从「原始态」到「可用态」的完整路径。每一步都有坑,但每一步也都有解法。

好了,关于数据采集与预处理,我就讲这么多。记住一句话:数据质量决定了分析的天花板。后面咱们聊具体的数据回放技巧时,你会更深刻地理解这一点。

总结:

  • 三种数据源:传感器日志、binlog、网络抓包,各有各的脾气
  • 去重和异常值处理,是数据清洗的两大核心
  • 格式化解决「长得不一样」,标准化解决「量纲不一样」
  • 每一步都踩过坑,但踩过了就是经验

可可精品资料库