数据采集与预处理:数据源类型与清洗标准化
大家好,我是老张。今天咱们聊聊数据采集与预处理。说实话,这活儿看着不起眼,但在我十几年的数据工程生涯里,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 倍。
处理方法:
- 阈值过滤:设定合理范围,超出就丢弃或标记
- 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、网络抓包,各有各的脾气
- 去重和异常值处理,是数据清洗的两大核心
- 格式化解决「长得不一样」,标准化解决「量纲不一样」
- 每一步都踩过坑,但踩过了就是经验