4. 样本数据清洗:去重、异常值处理、缺失值填充、格式统一化、数据脱敏技术

原始采集的压测样本往往包含脏数据、重复记录、格式不一致以及敏感信息。数据清洗的目标是将原始样本转化为高质量、可复用的特征数据集,确保压测结果的可信度与合规性。本章围绕五个核心环节展开:去重、异常值处理、缺失值填充、格式统一化与数据脱敏。

核心原则:清洗策略必须在压测样本构建阶段就嵌入自动化流水线,避免人工逐条修正带来的效率瓶颈与一致性风险。

4.1 数据去重

重复样本会导致压测流量分布失真,使某些接口或参数被过度测试,而其他路径覆盖不足。去重需区分完全重复与业务语义重复。

去重类型 判断依据 典型场景 处理策略
完全重复 所有字段值完全相同 日志采集重复、回放数据冗余 保留第一条,删除其余
业务主键重复 业务标识字段(如 orderId)相同 同一订单多次写入样本库 按时间戳保留最新或最完整记录
近似重复 关键字段相似度超过阈值 用户地址、商品名称微小差异 使用 SimHash / 编辑距离聚类去重
工程建议:在样本入库阶段使用 Redis 布隆过滤器或数据库唯一索引做实时去重,避免重复数据进入下游清洗管道。

4.2 异常值处理

异常值通常由采集抖动、埋点错误或恶意流量注入导致。若不处理,会污染特征分布,使压测模型产生偏差。常用检测与处理方法如下:

  • 统计法:基于箱线图(IQR)或 Z-Score 识别离群点,适用于数值型字段(如响应时间、请求体大小)。
  • 规则法:定义业务合法范围(如状态码只能为 200/404/500),超出范围直接标记为异常。
  • 聚类法:使用 DBSCAN 或孤立森林对多维特征进行异常检测,适合复杂关联场景。

处理方式包括:删除异常记录、替换为边界值(Winsorize)、或标记异常标签供后续特征工程使用。

# 示例:基于 Z-Score 的异常值标记(Python 伪代码)
import numpy as np

def mark_outliers_zscore(series, threshold=3):
    z = np.abs((series - series.mean()) / series.std())
    return series.where(z < threshold, other=np.nan)  # 异常值置为缺失

4.3 缺失值填充

样本中缺失字段可能来自网络截断、协议解析失败或可选参数未携带。填充策略需结合字段类型与业务含义:

字段类型 推荐填充方法 注意事项
数值型(如延迟、包大小) 中位数 / 均值填充 避免使用均值受异常值影响;中位数更稳健
分类型(如请求方法、协议) 众数填充 / 新增“未知”类别 众数填充可能引入偏差;新增类别更安全
时间戳 前向填充 / 插值 按时间序列顺序填充,保持时序连续性
文本型(如请求体) 占位符填充 / 模型预测 简单场景用空字符串;复杂场景用 NLP 模型补全
避坑提示:缺失率超过 60% 的字段建议直接删除,而非填充。强行填充高缺失字段会引入大量噪声,降低样本质量。

4.4 格式统一化

不同数据源(Nginx 日志、APM 链路、DB 导出)的字段格式往往不一致。格式统一化是后续特征提取与聚合的前提:

  • 时间格式:统一为 ISO 8601(如 2025-03-21T14:30:00Z),时区转为 UTC。
  • 数值精度:浮点数统一保留 2 位小数,整型去除千分位逗号。
  • 枚举值映射:如 GET / get / Get 统一转为大写 GET。
  • 编码转换:所有文本字段统一为 UTF-8,去除 BOM 头。
# 示例:时间格式统一化(Python)
from datetime import datetime

def normalize_timestamp(raw):
    # 支持多种输入格式
    for fmt in ["%Y-%m-%d %H:%M:%S", "%d/%b/%Y:%H:%M:%S", "%Y%m%d%H%M%S"]:
        try:
            return datetime.strptime(raw, fmt).isoformat() + "Z"
        except ValueError:
            continue
    return None  # 无法解析则标记为缺失

4.5 数据脱敏技术

压测样本常包含用户手机号、身份证、银行卡等敏感信息。脱敏必须在清洗阶段完成,确保样本可安全用于测试环境与外部协作。常用脱敏技术如下:

脱敏方法 适用字段 示例(原始 → 脱敏后) 可逆性
替换 手机号、邮箱 13800138000 → 138****8000 不可逆
遮蔽 身份证号、银行卡 110101199001011234 → 110101****1234 不可逆
泛化 年龄、地址 28岁 → 20-30岁;北京市海淀区 → 北京市 不可逆
加密 用户ID、Token user_abc123 → AES加密后的密文 可逆(需密钥)
假名化 姓名、用户名 张三 → 用户_7f3a 可逆(需映射表)
合规要点:脱敏后的样本仍需满足 GDPR / 《个人信息保护法》要求。建议在脱敏后执行一次“重识别风险评估”,确保无法通过关联分析还原原始身份。
样本数据清洗流水线 原始样本 ① 数据去重 完全重复 / 主键重复 / 近似重复 ② 异常值处理 统计法 / 规则法 / 聚类法 ③ 缺失值填充 中位数 / 众数 / 前向填充 / 占位符 ④ 格式统一化 时间 / 数值 / 枚举 / 编码 清洗后样本 ⑤ 数据脱敏 替换 / 遮蔽 / 泛化 / 加密 脱敏贯穿全流程,在输出前完成 确保样本合规可用

4.6 清洗效果验证

清洗完成后,需通过以下指标验证清洗质量:

  • 去重率:(清洗前记录数 - 清洗后记录数)/ 清洗前记录数,反映重复数据占比。
  • 异常值占比:被标记或处理的异常记录数 / 总记录数,应低于预设阈值(如 5%)。
  • 缺失率:每个字段的缺失值比例,清洗后应降至 0% 或可接受范围。
  • 脱敏覆盖率:敏感字段的脱敏比例,必须达到 100%。
自动化建议:将清洗规则封装为可配置的 YAML 文件,集成到 CI/CD 管道中。每次样本构建时自动执行清洗,并输出清洗报告供审计。