
1) 【一句话结论】
针对百万级设备网络流量日志,设计分阶段数据清洗流程:先通过日志格式验证、去重等基础步骤处理噪声,再结合统计方法(3σ原则)与机器学习(孤立森林)检测异常,并利用分布式框架(如Spark)实现并行处理,平衡效率与准确性,适配百万级设备日志的高并发处理需求。
2) 【原理/概念讲解】
数据清洗的核心是“识别并处理噪声、填补缺失、检测异常”。针对百万设备日志,需分步骤处理:
3) 【对比与适用场景】
| 方法类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 统计方法(3σ原则) | 基于数据正态分布的阈值检测,异常值=均值±3倍标准差 | 简单、计算量低、假设严格 | 数据分布已知且符合正态(如设备流量均值波动稳定) | 仅适用于正态分布,高维数据效果差,偏态数据误检率高 |
| 机器学习方法(孤立森林) | 通过随机森林构建异常检测器,异常值路径短 | 能处理高维、非正态数据,可学习复杂模式,参数可调(如树的数量、样本数) | 复杂异常模式(如DDoS攻击流量)、高维特征(如设备多维度指标) | 需训练、参数调优(如contamination参数设置异常比例),计算量稍高 |
4) 【示例】
# 伪代码示例(Spark DataFrame API)
def clean_logs(df):
# 1. 日志格式验证:检查字段完整性与类型
valid_logs = df.filter(
(col("device_id").isNotNull()) &
(col("timestamp").isNotNull()) &
(col("traffic").isNotNull()) &
(col("device_id").rlike(r"^[a-zA-Z0-9]+$")) &
(col("timestamp").rlike(r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$")) &
(col("traffic").rlike(r"^\d+(\.\d+)?$"))
)
# 2. 去重:设备ID+时间戳+流量值组合去重
deduped = valid_logs.dropDuplicates(subset=["device_id", "timestamp", "traffic"])
# 3. 缺失值填充:流量字段前向填充
filled = deduped.fillna({
"traffic": deduped["traffic"].fillna(method="ffill")
})
# 4. 异常值检测:3σ原则 + 孤立森林
# 3σ部分
mean, std = filled["traffic"].mean(), filled["traffic"].std()
thres = mean + 3 * std
stats_outliers = filled.filter(col("traffic") > thres)
# 孤立森林部分(假设设备类型分组)
grouped = filled.groupBy("device_type")
models = {}
for device_type, group in grouped:
model = IsolationForest(contamination=0.01) # 假设异常比例1%
model.fit(group.select("traffic").collect())
models[device_type] = model
# 预测异常
def predict_anomaly(row):
device_type = row["device_type"]
model = models.get(device_type, None)
if model:
pred = model.predict([[row["traffic"]]])[0]
return 1 if pred == -1 else 0 # 1表示异常
return 0
filled = filled.withColumn("is_anomaly", udf(predict_anomaly, IntegerType()))
return filled
5) 【面试口播版答案】
“面试官您好,针对百万台设备网络流量日志的清洗,我会设计一个分阶段的流程。首先处理噪声,比如验证日志格式(检查设备ID、时间戳、流量值等字段是否完整且类型正确,过滤无效日志);然后基础清洗,通过设备ID+时间戳+关键特征组合去重,避免重复记录。接下来填充缺失值,比如流量字段若时间序列连续,用前向填充,否则用模型预测。最后检测异常,结合3σ原则快速识别明显偏离正态的异常(适合数据分布已知的情况),再用孤立森林处理复杂异常(如攻击流量这类非正态、高维模式)。所有步骤通过Spark并行处理,应对百万级数据的高并发需求,确保清洗效率与准确性。”
6) 【追问清单】
7) 【常见坑/雷区】