OneID实体识别实战汽车行业图算法设计与避坑指南 | Entity Resolution | Spark GraphX | CDP | 数据治理18年汽车数字化实战经验从C企CDP项目拆解OneID完整设计方案图算法匹配、置信度分级、离线实时双轨架构、五大避坑要点。目录前言一、OneID概念解析二、汽车行业数据源全景三、图算法匹配设计四、置信度A/B分级五、数据清洗规则六、v_global_id虚拟ID机制七、归并和解绑逻辑八、离线实时双轨架构九、三级客户质量分类十、四个验证指标十一、五大避坑指南十二、总结前言上一篇聊了主数据治理这篇展开讲其中最核心的模块OneID。这是C企CDP项目中花时间最多、踩坑最深的模块也是数据治理从理论到落地最难啃的骨头之一。一、OneID概念解析DAMA体系里没有OneID这个词对应的学术术语是Entity Resolution实体识别把分散在不同数据源中的、指向同一现实实体的多条记录通过标识符匹配关联到统一ID。OneID完成后下一步是生成Golden Record黄金记录把匹配上的多条记录合并成一份最完整、最准确的客户档案。OneID 流程多源记录 → 标识符匹配 → 统一ID → 合并去重 → Golden Record核心区别OneID 识别「是不是同一个人」 Golden Record 合并后「最好的一份记录」二、汽车行业数据源全景C企CDP项目接入OneID计算的数据源最终覆盖了十几个系统40多张表。数据源主要标识典型场景单点登录系统SSOGlobalID 手机号认证用户的核心绑定关系CRM系统手机号销售线索、会员数据DCS系统多业务线手机号 证件号 VIN线索、订单、实销、维修工单DMP广告投放平台设备IDOAID/AndroidID/IMEI/IDFA广告点击行为统一埋点平台GlobalID/手机号/UnionID/OpenID/设备号App和小程序埋点数据全媒体系统手机号服务请求、用户沟通记录车联网平台车机端用户数据车机端用户行为官方App手机号App注册用户商城平台手机号电商会员企微ExternalUserID企业微信客户联系人直营线索平台手机号直营订单数据涉及的用户ID类型有12种GlobalID、手机号、证件号、邮箱、UnionID、OpenID、ExternalUserID、IMEI、AndroidID、OAID、IDFA、IDFV。人和车的关系更复杂一个人名下可能有多辆车一辆车也可能被多人使用。OneID不仅合并人还要建人-车关系图谱。三、图算法匹配设计核心思路用图算法替代简单的分级匹配。第一步Snowflake全局唯一编号给每一个「用户ID ID类型」的组合生成一个全局唯一的数字编号作为图计算的节点。节点示例手机号 13812345678 → Snowflake ID: 1234567890 GlobalID abc123 → Snowflake ID: 1234567891第二步构建关系对图的边同一条记录里既有手机号又有GlobalID两个ID之间就有一条边。关系对来自各个业务系统。第三步Spark GraphX连通图算法// 核心逻辑示意 val graph Graph(vertices, edges) val connectedComponents graph.connectedComponents().vertices // 互相能连通的ID会被分到同一个图中 // 一个图 一个潜在用户第四步选OneID在每个连通图里找优先级最高的ID类型用它的Snowflake编号作为OneID。ID优先级排序GlobalID单点登录ID手机号证件号邮箱UnionIDOpenIDExternalUserID企微IDIMEIAndroidIDOAIDIDFAIDFV冲突处理Dijkstra最短路径一个连通图里出现多个最高优先级ID时用Dijkstra算法计算路径权重权重最大的路径获胜另一个被拆分出去。这个过程叫「压制」对应的反向操作叫「增益」。四、置信度A/B分级维度A类高置信度B类低置信度权重1.00.8来源SSO account_info表、DCS实销客户表CRM线索表、全媒体、埋点平台、广告设备ID特点用户自注册验证、实名认证可能代填、未验证冲突处理优先采信让位A类冲突优先级规则account_info表 A类关系对 相同置信度下时间最新的关系对无效关系对不直接删存到脏数据表记录来源系统和脏数据原因。五、数据清洗规则物理ID清洗// 核心逻辑示意 val graph Graph(vertices, edges) val connectedComponents graph.connectedComponents().vertices // 互相能连通的ID会被分到同一个图中 // 一个图 一个潜在用户 # 手机号清洗规则 import re def clean_phone(phone): phone re.sub(r[^\d], , phone) # 去除所有非数字字符 if re.match(r^1[3-9]\d{9}$, phone): return phone # 有效手机号 elif re.match(r^\d{3,4}\d{7,8}$, phone): return phone # 座机号保留 else: return None # 脏数据存脏数据表 # 证件号校验身份证示例 def validate_id_card(id_card): if re.match(r^\d{15}$, id_card): return True # 15位老版身份证 elif re.match(r^\d{17}[\dXx]$, id_card): return True # 18位新版身份证 return False关系对清洗异常类型处理方式同系统内一对多/多对多只保留最新关系对其他进脏数据表跨系统冲突按优先级处理被丢弃的进脏数据表手机号关联超20个身份证号判定公共电话从OneID中移除关系对变更清除旧关系对保留最新六、v_global_id虚拟ID机制解决手机号单独出现时的OneID稳定性问题。场景手机号138先单独出现在CRM线索表 → 以手机号为OneID后来客户注册App → 有了GlobalIDOneID应该变成GlobalID → 但变了就要迁移所有历史数据解决方案手机号没有跟任何GlobalID同时出现时→ 用Snowflake生成v_global_id虚拟GlobalID→ 以v_global_id作为OneID→ 将来GlobalID出现归入同一连通图→ OneID编号不变 OneID不变性七、归并和解绑逻辑归并逻辑四种场景归并逻辑四种场景场景1: 手机号单独出现 → 以手机号为OneID场景2: GlobalID 新手机号 → 以GlobalID为OneID场景3: GlobalID 已有记录的手机号 → 以手机号已有OneID为准场景4: GlobalID重新绑新手机号 → 沿用GlobalID当前OneID解绑逻辑GlobalID跟手机号解绑后旧手机号废弃。如果后来被新客户办理重新走归并逻辑。踩过的坑会员解绑手机号后旧手机号在OneID里彻底消失历史数据断链。修复方案清洗关系对前先判断→ 被丢弃的ID是否还有其他关系对→ 有 → 不做处理→ 没有 → 生成v_global_id保留效果: 覆盖率提升约5%八、离线实时双轨架构离线T1全量源系统 → Hive → Spark GraphX → OneID结果每天凌晨跑最晚5点前完成实时增量源系统 → CDC → Kafka → Flink SQL清洗 → Kafka(关系对) → object-modeling服务 → PostgreSQL对齐策略每天凌晨离线跑完后 → 覆盖实时结果 → 数据对齐实时OneID目前接了两个场景线索汇聚和会员注册。九、三级客户质量分类级别条件说明认证会员GlobalID 手机号 证件号身份信息完整且认证普通会员GlobalID 手机号部分完整无证件号或未验证非会员无GlobalID只有手机号或设备ID待验证或匿名数据三级互斥可自动升级。非会员注册App变普通会员买车提供证件号变认证会员OneID不变。十、四个验证指标指标说明达标标准ID归属唯一性每个原始ID只能查到一个OneID100%重心稳定性OneID上可认证ID不应频繁变更版本间变更率低增益率算法连通原本不连通的ID的效果越高越好压制率算法打散不合理ID关联的效果合理范围增益率公式: (原始关系对数量 - OneID结果数量) / 原始关系对数量十一、五大避坑指南坑一源系统主数据不规范就上OneID手机号格式不统一证件号缺失率超30%。先做Data Profiling数据探查评估覆盖率、唯一性和规范度达标再进匹配流程。# Data Profiling 检查项 data_profiling: phone: coverage_rate: 85% uniqueness_rate: 95% format_compliance: 90% id_card: coverage_rate: 60% uniqueness_rate: 100%坑二关系对清洗太暴力导致物理ID消失一对多清洗时直接删关系对某些物理ID在OneID里消失。加了「保留孤岛ID」逻辑被丢弃的ID如果没有其他关系对生成v_global_id保留。约5%的数据受影响。坑三没有区分置信度等级所有关系对一视同仁低质量数据污染高质量数据。分A/B两类A类权重1.0B类权重0.8图算法路径计算中自动体现差异。坑四忽略了人-车关系汽车行业必须同时建人-车关系图谱。定义了24个融合对象每个对象有自己的归并规则。坑五不可逆操作没有审计合并操作不可逆。每次合并必须有审计日志脏数据表是审计依据不是垃圾箱。dirty_record_id: DRR_2024_00001, source_system: DCS, source_table: ustomer, confidence_level: A, dirty_reason: one_to_many_conflict, business_update_time: 2024-08-15T10:30:00Z, batch_time: 2024-08-16T02:00:00Z }十二、总结OneID看着是技术模块说到底是一套数据治理体系。前置工作主数据规范、数据质量、清洗规则、审核流程占70%精力匹配算法只占30%。C企CDP项目里OneID从V1到V3迭代了三个版本。V1接CRM和DCS核心数据V2加埋点平台和车联网数据V3补直营、官方App、电商数据。每个版本按「数据调研→策略定义→数据清洗→数据开发→数据验证」流程走。很多人问我要OneID技术方案我一般先反问你们源系统手机号规范率是多少回答不上来就不是做OneID的时候。TagsOneID EntityResolution CDP 数据治理 SparkGraphX 图算法 客户数据平台 GoldenRecord 数据质量 IdentityResolution 大数据 Flink Kafka Snowflake