3. 数据源准备:高频行情数据表结构、坏账标签表结构、时间分区与快照设计
高频行情坏账率 PSI 漂移监控的基石是高质量、可回溯的数据源。本章将详细定义两类核心数据表的结构设计、时间分区策略以及快照机制,确保后续的 PSI 计算与漂移检测具备准确、高效且可复现的数据基础。
3.1 高频行情数据表结构
高频行情数据是 PSI 计算的“特征输入”。表结构需兼顾存储效率与查询性能,通常采用列式存储(如 Parquet)并配合合理的数据类型。
| 字段名 | 数据类型 | 字段说明 | 分区键 |
|---|---|---|---|
symbol |
STRING | 交易标的代码(如 BTCUSDT) | 是 |
trade_time |
TIMESTAMP | 撮合时间(毫秒精度) | 是 |
price |
DOUBLE | 成交价格 | 否 |
volume |
DOUBLE | 成交量(基础货币单位) | 否 |
side |
STRING | 主动成交方向(BUY/SELL) | 否 |
trade_id |
BIGINT | 全局唯一成交编号 | 否 |
dt |
STRING | 日期分区(格式:yyyy-MM-dd) | 是 |
设计要点:高频行情表通常以
symbol 和 dt 作为联合分区键,避免全表扫描。对于日内查询,可进一步按 trade_time 进行桶排序(bucketing),加速时间窗口聚合。
3.2 坏账标签表结构
坏账标签是 PSI 计算的“目标变量”。该表记录每笔订单最终是否演变为坏账,以及坏账发生的具体时间点,用于与行情数据关联生成“坏账率”指标。
| 字段名 | 数据类型 | 字段说明 | 分区键 |
|---|---|---|---|
order_id |
STRING | 订单唯一标识 | 否 |
symbol |
STRING | 交易标的代码 | 是 |
open_time |
TIMESTAMP | 开仓时间 | 否 |
close_time |
TIMESTAMP | 平仓/强平时间 | 否 |
is_bad_debt |
BOOLEAN | 是否标记为坏账 | 否 |
bad_debt_amount |
DOUBLE | 坏账金额(若为坏账) | 否 |
bad_debt_time |
TIMESTAMP | 坏账确认时间 | 否 |
dt |
STRING | 日期分区(基于 close_time) | 是 |
关键约束:坏账标签表必须与行情表使用相同的
symbol 编码规则,且 dt 分区需对齐。若坏账确认时间晚于平仓时间,需以 bad_debt_time 所在日期作为分区依据,确保数据时效性。
3.3 时间分区与快照设计
PSI 监控要求在不同时间窗口(如日、周、月)上对比特征分布。合理的时间分区与快照设计是高效执行对比查询的关键。
3.3.1 时间分区策略
- 日期分区(dt):所有表统一使用
dt作为一级分区,格式为yyyy-MM-dd。查询时通过WHERE dt = '2025-03-01'快速裁剪数据。 - 小时/分钟子分区(可选):对于日内高频监控,可在
dt下增加hour或minute子分区,进一步加速细粒度聚合。 - 快照表(Snapshot Table):为支持历史回溯,每日生成一张“全量快照表”,包含当日所有活跃订单的最终状态。快照表以
snapshot_dt为分区键,保留最近 90 天数据。
3.3.2 快照设计示例
-- 创建每日快照表
CREATE TABLE risk.snapshot_daily (
snapshot_dt STRING,
symbol STRING,
order_id STRING,
open_time TIMESTAMP,
close_time TIMESTAMP,
is_bad_debt BOOLEAN,
bad_debt_amount DOUBLE,
-- 衍生特征:坏账率标签
bad_debt_flag INT
)
PARTITIONED BY (dt STRING)
STORED AS PARQUET;
-- 插入当日快照数据
INSERT OVERWRITE TABLE risk.snapshot_daily PARTITION (dt = '2025-03-01')
SELECT
'2025-03-01' AS snapshot_dt,
symbol,
order_id,
open_time,
close_time,
is_bad_debt,
bad_debt_amount,
CASE WHEN is_bad_debt THEN 1 ELSE 0 END AS bad_debt_flag
FROM risk.order_labels
WHERE dt = '2025-03-01';
快照优势:快照表将“当日订单状态”固化,避免后续因数据回溯导致的 PSI 计算结果漂移。PSI 计算时,只需读取对应日期的快照分区,无需关联多张原始表。
3.4 数据源架构总览
下图展示了高频行情数据、坏账标签数据与快照表之间的流转关系,以及时间分区如何支撑 PSI 监控的对比查询。
3.5 数据源准备清单
在实际落地时,请按以下步骤完成数据源准备,避免遗漏关键环节:
- 确认行情数据粒度:确保高频行情表包含毫秒级
trade_time,且price和volume无空值。 - 对齐坏账标签时间:坏账标签的
close_time或bad_debt_time必须能与行情表的trade_time窗口关联。 - 创建快照表并初始化:运行示例 SQL 创建
snapshot_daily表,并回填最近 30 天数据。 - 验证分区裁剪:执行
EXPLAIN SELECT ... WHERE dt = '2025-03-01'确认查询只扫描对应分区。 - 设置数据保留策略:原始行情表保留 7 天,快照表保留 90 天,坏账标签表永久保留。
实操建议:在开发环境中,先使用 3 天的行情与标签数据构建快照,验证 PSI 计算逻辑无误后,再扩展至全量数据。快照表建议使用列式存储(Parquet)并启用压缩,可减少 60% 以上的存储空间。