2. Spark在风控场景中的角色:Spark生态简介、Spark与Hadoop对比、Spark在特征工程与抽样中的优势

2.1 Spark生态简介

Apache Spark 是一个统一的分析引擎,专为大规模数据处理而设计。在风控领域,Spark 生态的核心组件构成了从数据接入、特征加工到模型推理的完整技术栈。

核心组件矩阵 — 风控场景下最常用的 Spark 组件及其职责
组件 全称 风控场景典型用途
Spark Core 基础执行引擎 RDD 容错、任务调度、内存管理
Spark SQL 结构化数据处理 用户画像宽表加工、特征 SQL 查询
DataFrame / Dataset 高级 API 特征分层、样本抽样、缺失值填充
MLlib 机器学习库 特征缩放、WOE 编码、LR / GBDT 训练
Spark Streaming 流处理引擎 实时特征计算、在线样本采集

Spark 生态的另一个关键优势是 统一编程模型:风控工程师可以用同一套 DataFrame API 完成离线特征工程、实时样本采集和在线推理,无需切换技术栈。

Spark 风控生态架构 HDFS / Hive Kafka 实时流 RDBMS / NoSQL 日志文件 Spark Core — 统一执行引擎(RDD / 调度 / 内存管理) TaskScheduler · BlockManager · ShuffleManager Spark SQL DataFrame / SQL 特征加工 MLlib 特征工程 · 模型训练 Spark Streaming 实时特征 · 在线抽样 风控应用:特征分层 · 样本抽样 · 模型推理 · 实时决策

2.2 Spark与Hadoop对比

Hadoop MapReduce 曾是风控大数据处理的默认选择,但 Spark 在多个关键维度上实现了代际升级。以下对比基于风控特征工程和样本抽样的实际场景。

对比维度 Hadoop MapReduce Apache Spark 风控场景影响
计算模型 磁盘迭代,每一步写 HDFS 内存 DAG,链式流水线 Spark 特征加工速度提升 10~100x
中间结果 必须落盘,IO 开销大 优先内存缓存,可持久化 多层特征衍生时 Spark 优势明显
API 易用性 仅 Java,代码冗长 Python / Scala / SQL / R 风控团队可用 Python + SQL 快速迭代
实时能力 仅批处理 批 + 流(Structured Streaming) 支持实时样本采集与特征计算
机器学习 需外部集成 内置 MLlib 特征缩放、WOE 编码一站式完成
容错机制 任务级重算 RDD Lineage + Checkpoint 两者均可靠,Spark 恢复更快
选型建议: 如果风控团队已有 Hadoop 集群且特征加工以简单 ETL 为主,可继续使用 Hive on MR。但涉及多层特征衍生、迭代式抽样、实时特征计算时,Spark 是更优选择。多数头部金融风控团队已全面迁移至 Spark。

2.3 Spark在特征工程与抽样中的优势

风控特征工程和样本抽样对计算引擎有特殊要求:高吞吐、低延迟、支持迭代、易于表达复杂逻辑。Spark 在以下四个维度提供了差异化能力。

2.3.1 内存计算加速特征衍生

风控特征工程常涉及多表 Join、窗口聚合、时间滑窗等操作。Spark 的 DAG 调度器将多个 Stage 合并为流水线,中间结果驻留内存,避免频繁磁盘 IO。

# 风控特征衍生示例:30天滑动窗口聚合
from pyspark.sql import functions as F
from pyspark.sql.window import Window

window_spec = Window.partitionBy("user_id") \
                    .orderBy("trans_dt") \
                    .rowsBetween(-29, 0)

df_features = df_transactions.withColumn(
    "amt_avg_30d", F.avg("trans_amt").over(window_spec)
).withColumn(
    "cnt_30d", F.count("trans_id").over(window_spec)
)

2.3.2 统一批流架构简化样本采集

传统风控样本采集需要维护两套代码:离线批处理采集历史样本,实时流处理采集在线样本。Spark Structured Streaming 允许用同一套 DataFrame API 同时处理批和流,大幅降低维护成本。

统一样本采集流程:
  1. 离线阶段:读取 Hive 历史交易表,按时间分层抽样
  2. 实时阶段:消费 Kafka 实时交易流,在线标记样本标签
  3. 合并输出:统一写入 Delta Lake / Hive 样本宽表

2.3.3 内置 MLlib 降低特征工程复杂度

特征工程中的常见操作如归一化、分箱、WOE 编码、One-Hot 编码,MLlib 均提供原生实现,无需额外引入第三方库。

from pyspark.ml.feature import MinMaxScaler, VectorAssembler

# 特征缩放
assembler = VectorAssembler(inputCols=["amt", "cnt", "age"], outputCol="features_vec")
scaler = MinMaxScaler(inputCol="features_vec", outputCol="scaled_features")

pipeline = Pipeline(stages=[assembler, scaler])
df_scaled = pipeline.fit(df).transform(df)

2.3.4 弹性分布式抽样保证样本代表性

风控建模要求样本在时间、用户群、风险等级等维度上保持分层均衡。Spark 的 DataFrame API 支持精确的分层抽样和随机抽样,且天然支持分布式执行。

Spark 分布式抽样流程 全量样本宽表 Hive / Delta Lake 分区1 时间: 2024-01 分区2 时间: 2024-02 分区N 时间: 2024-0N 分层抽样算子 sampleBy / 自定义UDF 随机抽样算子 sample(fraction, seed) 时间窗口抽样 filter + sample 训练样本集
避坑提示: Spark 的 sample() 默认是伯努利抽样,不保证精确比例。风控分层抽样应使用 sampleBy() 或先 groupBy 再 sample(),确保各风险等级样本比例与总体一致。

2.3.5 优势总结

风控场景 Spark 优势 性能提升参考
多表 Join 特征衍生 Broadcast Join + 内存缓存 3~10x vs MapReduce
时间滑窗聚合 Window 函数 + 流水线执行 5~20x vs Hive MR
分层样本抽样 sampleBy + 分布式随机数 线性扩展,TB 级分钟完成
实时样本采集 Structured Streaming Exactly-Once 秒级延迟,百万 QPS
特征编码与缩放 MLlib Pipeline 一站式处理 减少 60% 代码量