2. 金融图谱基础:实体、关系与属性的定义
金融图谱是样本偏差校验的数据底座。在构建校验逻辑之前,必须统一对“实体”、“关系”、“属性”三个核心概念的定义,并理解它们在典型金融场景中的映射关系。本节将建立这套语义标准,为后续 Spark SQL 校验规则提供精确的数据模型依据。
2.1 实体、关系与属性的三元组定义
金融图谱采用 (实体—关系—实体) 的三元组结构来描述金融世界。每个元素在 Spark SQL 校验中对应不同的数据列和约束条件。
| 概念 | 定义 | 金融示例 | 校验关注点 |
|---|---|---|---|
| 实体 | 独立存在的业务对象,拥有唯一标识 | 客户、账户、交易、机构 | ID 唯一性、属性完整性 |
| 关系 | 实体之间的语义连接,可带方向 | “持有”、“转账”、“属于” | 关系类型合法性、时间有效性 |
| 属性 | 实体或关系的特征描述 | 客户年龄、账户余额、交易金额 | 数据类型、值域范围、空值率 |
校验提示: 在 Spark SQL 中,实体通常存储为顶点表(Vertex Table),关系存储为边表(Edge Table)。属性列必须提前定义好数据类型(StringType、DoubleType、TimestampType 等),否则偏差校验会因隐式类型转换产生误报。
2.2 典型金融图谱模型:客户、账户、交易
以零售金融风控场景为例,最核心的图谱模型包含三类实体和两类关系。下图展示了该模型的完整结构:
模型要点:
- 客户 → 账户:一对多关系,一个客户可持有多个账户(借记卡、信用卡、理财账户)。
- 账户 → 交易:一对多关系,一个账户可发生多笔交易(消费、转账、取现)。
- 交易 → 交易:转账关系,一笔交易可能关联另一笔交易(对手交易)。
2.3 实体与关系的属性清单
在 Spark SQL 样本偏差校验中,每个实体和关系都需要预定义属性清单。以下为典型字段定义:
| 实体/关系 | 属性名 | 数据类型 | 校验规则 |
|---|---|---|---|
| 客户 | client_id | StringType | 非空、唯一 |
| age | IntegerType | 0 ≤ age ≤ 120 | |
| gender | StringType | ∈ {M, F, U} | |
| 账户 | account_id | StringType | 非空、唯一 |
| balance | DoubleType | balance ≥ 0 | |
| open_date | DateType | ≤ 当前日期 | |
| 交易 | txn_id | StringType | 非空、唯一 |
| amount | DoubleType | amount > 0 | |
| txn_time | TimestampType | 非空、合理时间范围 | |
| 持有关系 | client_id | StringType | 外键,引用客户表 |
| account_id | StringType | 外键,引用账户表 | |
| 转账关系 | from_txn_id | StringType | 外键,引用交易表 |
| to_txn_id | StringType | 外键,引用交易表 |
常见偏差陷阱: 在真实生产数据中,
balance 字段常出现负值(透支场景),age 字段可能出现 0 或 200+(数据录入错误)。这些偏差必须在 Spark SQL 校验阶段被识别并标记,否则会污染下游风控模型的特征分布。
2.4 图谱模型在 Spark SQL 中的表结构映射
金融图谱在 Spark 中通常以三张表存储:顶点表(实体)、边表(关系)、属性表(可选)。以下为建表 SQL 示例:
-- 顶点表:客户
CREATE TABLE IF NOT EXISTS dim_client (
client_id STRING COMMENT '客户唯一标识',
age INT COMMENT '年龄',
gender STRING COMMENT '性别 M/F/U',
create_dt DATE COMMENT '数据加载日期'
) USING parquet
PARTITIONED BY (create_dt);
-- 顶点表:账户
CREATE TABLE IF NOT EXISTS dim_account (
account_id STRING COMMENT '账户唯一标识',
balance DOUBLE COMMENT '当前余额',
open_date DATE COMMENT '开户日期',
create_dt DATE
) USING parquet
PARTITIONED BY (create_dt);
-- 边表:持有关系
CREATE TABLE IF NOT EXISTS rel_holds (
client_id STRING COMMENT '客户ID',
account_id STRING COMMENT '账户ID',
start_dt DATE COMMENT '关系生效日期',
end_dt DATE COMMENT '关系失效日期',
create_dt DATE
) USING parquet
PARTITIONED BY (create_dt);
校验前置条件: 在运行样本偏差校验之前,必须确认上述三张表的
PARTITION 分区策略一致(通常按日期分区),否则 Spark SQL 的 Join 操作会产生跨分区数据倾斜,导致校验结果失真。
2.5 图谱模型与偏差校验的关联
理解实体、关系、属性的定义后,样本偏差校验的每个步骤都可以映射到图谱元素上:
- 实体完整性校验:检查
dim_client和dim_account中是否存在空 ID 或重复 ID。 - 关系一致性校验:检查
rel_holds中的client_id是否在dim_client中存在,account_id是否在dim_account中存在。 - 属性分布偏差校验:检查
age、balance、amount等字段的均值、标准差、空值率是否偏离预期基线。 - 时间序列偏差校验:检查
txn_time的时间跨度是否与训练集一致,是否存在未来时间戳。
下图展示了从图谱模型到 Spark SQL 校验任务的完整链路:
核心结论: 金融图谱的实体、关系、属性定义是样本偏差校验的元数据基础。在 Spark SQL 中,每一类校验任务都对应特定的图谱元素和 SQL 模式。只有定义清晰、类型准确、约束完整的图谱模型,才能产出可信的偏差校验结果。